工作中的程序,大部分为二进制发布
但由此就很容易出现,由于某些库采用动态链接,发布后由于目标环境没有此库,导致程序启动失败
默认情况下,gcc在-lxxx时,如果同时存在libxxx.so和libxxx.a,会优先链接动态库libxxx.so
其中一种解决方案是,移除libxxx.so,但这显然不是一个很好的办法
更好的办法是,明确告诉gcc,这个库链接其静态版本
在参考了这篇文章(《关于GCC中同时使用动态和静态库链接的操作参数和解释》)后,方法如下:
增加 -Wl,-dn 和 –Wl,dy,即: -Wl,-dn -lxxx -Wl,-dy
其中尤其需要注意 –Wl, ,有些文章只告诉了可以使用-dn(或-Bstatic)参数,如果缺少 –Wl,,是不生效的
原因在上边的那篇文章有,摘录如下:
Note - if the linker is being invoked indirectly, via a compiler driver (eg gcc
) then all the linker command line options should be prefixed by -Wl,
(or whatever is appropriate for the particular compiler driver) like this:
gcc -Wl,--startgroup foo.o bar.o -Wl,--endgroup