Linux下动态库制作与使用

有一文件 apple.c 需要做成在 arm 平台下可以使用动态库,且该文件依赖与 jpeg 图片解码库 libjpeg.so
1: 生成 apple.o 文件
编译命令: arm-none-linux-gnueabi-gcc apple.c -o apple.o -I /home/gec/jpeg/include -c fPIC -ljpeg
/home/gec/jpeg/include: 为 jpeg 库需要的头文件路径
ljpeg: 指明需要链接的库名为: libjpeg

2; 生成 libapple.so 文件
编译命令: arm-none-linux-gnueabi-gcc -shared -fPIC -o libapple.so apple.o
libapple.so: 生成的库名,库名要以 “lib” 为前缀,”.so” 为后缀

3: 现在我有一个叫 user.c 的文件要包含 libapple.so 这个库
编译命令: arm-none-linux-gnueabi-gcc user.c -o userelf -ldl -L/home/gec/jpeg/lib/ -ljpeg
userelf: 生成的可执行文件名
/home/gec/jpeg/lib/ -ljpeg: 我的 user.c 与jpeg库没有直接联系的为什么要链接呢?
原因: user.c 需要链接 libapple.so 而 libapple.so 要依赖与 libjpeg.so。如果在编译 user.c 时没有
链接 libjpeg.so 库,那么在 userelf 运行时,libapple.so 就无法找到 libjpeg.so 。这种情况在编译
时时不会有任何提示信息的,需要自己注意。
ldl: 在程序中打开库的话需要链接库相关操作的动态库
库操作相关函数
dlopen函数: void *dlopen(const char *filename, int flags)

//使用方法:
void *handle = dlopen("libapple.so", RTLD_NOW);
if (handle == NULL)
{
    perror("打开库出现的错误或者库不存在");
    exit(1);
}
//假如在 libapple.so 中有一个 char *show(int a); 函数
char *(*show)(int a) = dlsym(handle, "show");
//现在在 user.c 中的函数指针 show 就是libapple.so 中的 show 函数,二者没有区别

失败或者错误时返回值为空 :NULL
filename: 可以是绝对路径下的文件名, 也可以是单独的文件名。后者需要设置环境变量 LD_LIBRARY_PATH
flags : 指明什么时候加载动态库,一般立即加载。则 flags 可以是: RTLD_NOW

dlsym函数: void *dlsym(void *handle, const char *symbol)
返回值为函数指针,通过该函数指针可以直接使用到libapple.so 中的 symbol 函数
handle: 由 dlopen 得到的动态库指针
symbol: 需要使用的函数的函数名

猜你喜欢

转载自blog.csdn.net/qq_41985711/article/details/81747536