[User:root Time:16:46:48 Path:/home/liangdong/cpp]$ ll
total 12
-rw-r--r--. 1 root root 120 May 4 16:46 libtest.cpp
-rw-r--r--. 1 root root85 May 4 16:45 libtest.h
-rw-r--r--. 1 liangdong daemon 141 May 4 16:42 main.cpp
[User:root Time:16:46:48 Path:/home/liangdong/cpp]$ cat libtest.cpp libtest.h main.cpp
#include "libtest.h"
#include <iostream>
using namespace std
void test::function() {
cout<<"test::function"<<endl
}
#ifndef _H_TEST
#define _H_TEST
class test {
public:
void function()
}
#endif
#include <iostream>
#include "libtest.h"
using namespace std
int main(int argc, char* const argv[]) {
test t
t.function()
return 0
}
[User:root Time:16:46:55 Path:/home/liangdong/cpp]$ g++ -o libtest.so -fPIC -shared libtest.cpp -I.
[User:root Time:16:47:29 Path:/home/liangdong/cpp]$ g++ -o main main.cpp -L. -ltest
[User:root Time:16:47:48 Path:/home/liangdong/cpp]$ ll
total 28
-rw-r--r--. 1 root root120 May 4 16:46 libtest.cpp
-rw-r--r--. 1 root root 85 May 4 16:45 libtest.h
-rwxr-xr-x. 1 root root 5773 May 4 16:47 libtest.so
-rwxr-xr-x. 1 root root 5876 May 4 16:47 main
-rw-r--r--. 1 liangdong daemon 141 May 4 16:42 main.cpp
[User:root Time:16:47:50 Path:/home/liangdong/cpp]$ ./main
./main: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
[User:root Time:16:47:51 Path:/home/liangdong/cpp]$ export LD_LIBRARY_PATH=.
[User:root Time:16:48:01 Path:/home/liangdong/cpp]$ ./main
test::function
[User:root Time:16:48:04 Path:/home/liangdong/cpp]$
实例代码(soTest.c):1 #include <stdio.h>
2 #include <dlfcn.h>
3
4 int main(int argc, char *argv[]){
5 void * libm_handle = NULL
6 float (*cosf_method)(float)
7 char *errorInfo
8 float result
9
10 // dlopen 函数还会自动解析共享库中的依赖项。这样,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。
11 // 函数返回一个句柄,该句柄用于后续的 API 调用
12 libm_handle = dlopen("libm.so", RTLD_LAZY )
13 // 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象
14 if (!libm_handle){
15 // 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因
16 printf("Open Error:%s.\n",dlerror())
17 return 0
18 }
19
20 // 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误
21 cosf_method = dlsym(libm_handle,"cosf")
22 errorInfo = dlerror()// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空
23 if (errorInfo != NULL){
24 printf("Dlsym Error:%s.\n",errorInfo)
25 return 0
26 }
27
28 // 执行“cosf”方法
29 result = (*cosf_method)(0.0)
30 printf("result = %f.\n",result)
31
32 // 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问
33 dlclose(libm_handle)
34
35 return 0
36 }
在这个例子中主要是调用了 math 库(libm.so)中的“cosf”函数,dlopen函数的第二个参数表示加载库文件的模式,主要有两种:RTLD_LAZY 暂缓决定,等有需要时再解出符号;RTLD_NOW 立即决定,返回前解除所有未决定的符号。另外记得引用包含API的头文件“#include <dlfcn.h>”(^_^)。
新建一个sort.c文件,写一个最简单的排序
使用 gcc -o libsort.so -fPIC -shared sort.c 产生libsort.so库。
.so库有两种调用方法:
新建main.c文件:
使用命令 gcc -o main main.c -lsort -L. 编译。
新建main2.c文件:
使用命令 gcc -o main2 main2.c -ldl 编译。动态加载.so库的话需要-ldl。
运行./main2后输出递增序列,调用成功。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)