gcc系强制链接静态库(同时有.so和.a)

Posted IT点滴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc系强制链接静态库(同时有.so和.a)相关的知识,希望对你有一定的参考价值。

1. 坑多的办法

-static

如果需要链接成不依赖任何so文件的程序,用ldd查看显示为"not a dynamic executable",但是这个选项时不推荐的。

即使像这样链接(c++):“-static-libgcc -static-libstdc++ -static”

  一是会出现警告,比如我使用了系统调用getaddrinfo,“Using ‘getaddrinfo‘ in statically linked applications requires at runtime the shared libraries from the glibc version used for l
inking”

  二是会挂(c代码没试过),类似如下的调用栈,在main函数之前,知道原因的同学请留言:-)

 

[plain] view plain copy
 
  1. #0  0x0000000000000000 in ?? ()  
  2. #1  0x0000000000437c61 in std::locale::_S_initialize() ()  
  3. #2  0x0000000000437ca3 in std::locale::locale() ()  
  4. #3  0x0000000000435ce4 in std::ios_base::Init::Init() ()  
  5. #4  0x0000000000401925 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/5/iostream:74  
  6. #5  0x000000000040194f in _GLOBAL__sub_I__Z4addrv () at src/cotasia.cpp:49  
  7. #6  0x00000000004cf377 in __libc_csu_init ()  
  8. #7  0x00000000004ce97e in generic_start_main ()  
  9. #8  0x00000000004cebca in __libc_start_main ()  
  10. #9  0x0000000000400d89 in _start ()  


2. 普遍的做法

就是直接连接.a文件全路径,这没啥好说的,就把它当.o文件一样链接。

 

3. 优雅的做法

既然是库,-l和-L才是正派的做法,比如同一目录下有libxxx.a文件和libxxx.so文件,gcc默认会链接so,改变这一默认行为的方法就是:将"-lxxx"改为"-l:libxxx.a"

 

强制链接某后缀名非so(带版本的so),用 -l:libxxx.so.xxxx 链接选项

以上是关于gcc系强制链接静态库(同时有.so和.a)的主要内容,如果未能解决你的问题,请参考以下文章

如何强制gcc链接未使用的静态库

Android NDK编译如何强制使用libc++.a的静态链接库

当存在同名的共享库时,如何强制链接静态库

Linux动态链接和静态链接简析

Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

GCC编译过程与动态链接库和静态链接库