GCC 编译动态库 so文件时,静态链接libmysqlclient.a 与动态链接参数一起使用问题。
2018-01-16 17:44
836 查看
直接放结论, 下面是编译一个使用了mysql C API 的 mysql.so 文件(我们的业务中,它是zbx加裁的modules so文件)
-Wl,-Bstatic 使用这个参数,后面接的 -l{库名称} 就是使用静态链接。
-Wl,-Bdynamic 同理,后续的-l 就是动态链接。
由于 libmysqlclient_xx.so 中的经常有版本号(5.6=18, 5.7=20)问题,所以使用静态链接能免除此问题。
没版本问题与路径不一致问题的的so依赖文件,就可以使用动态链接。
gcc -fPIC -shared -o mysql.so mysql.c \ -I/usr/include/mysql \ -L/usr/lib64/mysql \ -Wl,-Bstatic -lmysqlclient \ -Wl,-Wl,-Bdynamic -lssl -lgcc_s -lm -lrt
解释:
-fPIC -shared 参数 一般是一起使用使用,编译so文件用,其不能直接与 -static 参数混用。-Wl,-Bstatic 使用这个参数,后面接的 -l{库名称} 就是使用静态链接。
-Wl,-Bdynamic 同理,后续的-l 就是动态链接。
排查方法:
先使用全动态编译编译出所需要 的so文件,使用ldd命令查看其依赖了哪些动态库(与路径)。由于 libmysqlclient_xx.so 中的经常有版本号(5.6=18, 5.7=20)问题,所以使用静态链接能免除此问题。
没版本问题与路径不一致问题的的so依赖文件,就可以使用动态链接。
相关文章推荐
- 抽取VS文件组成类GCC的编译器,并编译C程序为dll动态链接库
- 一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三).so文件编译过程问题的解决
- 使用gcc编译时,头文件和库的位置指定参数
- GCC中同时使用动态和静态库链接的操作参数
- 关于GCC中同时使用动态和静态库链接的操作参数和解释
- gcc链接动态库时,两个动态库中符号重名的问题
- Linux下的动态链接库.so文件的使用
- PHP扩展框架各个宏编译成so动态链接库文件之后对应的函数符号对照
- 关于GCC中同时使用动态和静态库链接的操作参数和解释
- 转:关于GCC中同时使用动态和静态库链接的操作参数和解释
- gcc 使用静态库文件 链接库文件 .a makefile .so
- Linux下的动态链接库.so文件的使用
- GCC中同时使用动态和静态库链接的编译
- Linux开发常见问题:GCC:链接器输入文件未使用,因为链接尚未完成
- gcc/g++ 动态编译和链接问题
- linux下动态链接问题(.so文件的编写与调用)
- 关于GCC中同时使用动态和静态库链接的操作参数和解释
- 如何用GCC编译出动态库文件(*.so)
- Linux下的动态链接库.so文件的使用
- Linux下的动态链接库.so文件的使用