编译详解
GCC
动态库
生成动态库
编译
gcc –c –I /usr/dev/mysql/include test.c –o test.o
链接
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
动态库依赖动态库
A. gcc blowfish_sample_yunduan.c -lssl -lcrypto -fPIC -shared -o libtest.so
B. gcc blowfish_sample_yunduan.c -fPIC -shared -o libtest.so
A编译出的SO对ssl有依赖关系,这时候如果系统没有so或者so依赖的版本不对,就会存在问题。
为了解决这个问题,采用B的编译方式,缺少的时候,去系统so中。
静态库转换为动态库
ar -x mylib.a
gcc -fPIC -shared *.o -o libauthority.so
包含c++代码
g++ -fPIC -shared *.o -o libauthority.so
静态库
强制使用静态库
gcc –L /usr/dev/mysql/lib –static
–lmysqlclient test.o –o test
搜索顺序
静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
动态链接时、执行时搜索路径顺序:
1. 编译目标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径