链接静态库的顺序问题

简介: 相关博文1:http://blog.chinaunix.net/uid-20682147-id-5198933.html相关博文2:http://blog.chinaunix.net/uid-20682147-id-5096676.
相关博文1: http://blog.chinaunix.net/uid-20682147-id-5198933.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的,因为编译一个静态库不会使用到链接选项,而只需要指定需要依赖的头文件路径即可.


  1. -Wl的使用
  2. -Wl表示后面的参数传递给链接器,其中l是linker的意思。
  3. 链接时指定共享库的搜索路径(类似于设置LD_LIBRARY_PATH):
  4. -Wl,-rpath=/usr/local/abc:/data/abc
  5. 以上也可以分开写:
  6. -Wl,-rpath=/usr/local/abc -Wl,-rpath=/data/abc
  7. 部分库链接它的静态库,部分库链接它的共享库:
  8. -Wl,-static -lb -Wl,-call_shared -la -lz
  9. 指定链接器:
  10. -Wl,-dynamic-linker /lib/ld-linux.so.2 -e _so_start
  11. 指定导出的符号:
  12. -Wl,--export-dynamic,--version-script,exports.lds
  13. exports.lds的格式可以为:
  14. {
  15. global:
  16. foo;
  17. };
  18. 指定共享库的soname:
  19. -Wl,--export-dynamic,--version-script,exports.lds,-soname=libqhttpd.so
  20. -rpath 增加共享库搜索路径
  21. --retain-symbols-file表示不丢弃未定义的符号和需要重定位的符号
  22. --export-dynamic 创建一个动态连接的可执行程序时, 把所有的符号加到动态符号表中

相关文章
|
1月前
|
存储 自然语言处理 编译器
|
3月前
|
存储 编译器
编译和链接
编译和链接
44 1
|
4月前
|
存储 自然语言处理 算法
程序的编译和链接
程序的编译和链接
19 0
|
5月前
|
编译器
编译和链接(下)
编译和链接(下)
32 0
|
5月前
|
存储 自然语言处理 程序员
编译和链接(上)
编译和链接(上)
24 0
|
11月前
|
Linux 编译器 C语言
gcc后续——链接时的静态库和动态库
gcc后续——链接时的静态库和动态库
107 0
|
存储 程序员 编译器
【程序的编译(预处理操作)+链接】
【程序的编译(预处理操作)+链接】
【程序的编译(预处理操作)+链接】
|
自然语言处理 程序员 C语言
编译与链接
编译与链接
128 0
编译与链接
|
C语言
GCC链接编译例子
GCC链接编译例子
98 0