相关博文1:
http://blog.chinaunix.net/uid-20682147-id-5198933.html
相关博文2: http://blog.chinaunix.net/uid-20682147-id-5096676.html
在链接静态库时,如果多个静态库之间存在依赖关系,则有依赖关系的静态库之间存在顺序问题,这个在使用静态库时,需要注意,否则会报符号找不到问题,举例:
相关博文2: http://blog.chinaunix.net/uid-20682147-id-5096676.html
在链接静态库时,如果多个静态库之间存在依赖关系,则有依赖关系的静态库之间存在顺序问题,这个在使用静态库时,需要注意,否则会报符号找不到问题,举例:
libb.a依赖于是liba.a,而可执行文件test只直接依赖于libb.a,则链接选项应当为:
-b -a,而不是-a -b,否则会报liba.a中的某些符号找不到.
gcc -c a.c
ar cr liba.a a.o
gcc -c b.c
ar cr libb.a b.o # 虽然libb.a使用到了liba.o中的一些函数,但并不会将它们的定义包含进来,所以在链接test时需要指定这两个库
另外,在编译libb.a时是不指定liba.a的,因为编译一个静态库不会使用到链接选项,而只需要指定需要依赖的头文件路径即可.
- -Wl的使用
- -Wl表示后面的参数传递给链接器,其中l是linker的意思。
- 链接时指定共享库的搜索路径(类似于设置LD_LIBRARY_PATH):
- -Wl,-rpath=/usr/local/abc:/data/abc
- 以上也可以分开写:
- -Wl,-rpath=/usr/local/abc -Wl,-rpath=/data/abc
- 部分库链接它的静态库,部分库链接它的共享库:
- -Wl,-static -lb -Wl,-call_shared -la -lz
- 指定链接器:
- -Wl,-dynamic-linker /lib/ld-linux.so.2 -e _so_start
- 指定导出的符号:
- -Wl,--export-dynamic,--version-script,exports.lds
- exports.lds的格式可以为:
- {
- global:
- foo;
- };
- 指定共享库的soname:
- -Wl,--export-dynamic,--version-script,exports.lds,-soname=libqhttpd.so
- -rpath 增加共享库搜索路径
- --retain-symbols-file表示不丢弃未定义的符号和需要重定位的符号
- --export-dynamic 创建一个动态连接的可执行程序时, 把所有的符号加到动态符号表中