遇到了两个小小的问题,但不好找到思路,这里记录一下。
问题一 强制静态链接或强制动态链接
在默认情况下,如果同时存在 lib.so 和 lib.a ,则将采取动态链接,那么如何强制某一种链接呢?
这里要用到GCC和LD编译过程的命令,假设我们有libA需要静态链接,libB需要动态链接,另有一个libC,我们可以使用如下命令:
gcc ... -Wl,-Bstatic -lA -Wl,-Bdynamic -lB ... -lC
按照指定-B即可确定链接方式,但问题来了:libC将采取与他最近的链接方式强制进行。这就很不好了...所以最好的办法还是分别进行连接,比如在LDFLAGS中进行区别。
问题二 程序运行时动态库加载失败
新安装的动态库总是不能被立即找到,比较有经验的同学可能会试用一下 ldconfig 命令,但这个命令 默认只关心系统目录下的库,所以在我们自己编译安装的库更新时需要对 ldconfig 配置进行一下更改:
使用命令:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig直接更改:
进入/etc/ld.so.conf
加入/usr/local/lib
执行ldconfig
当然上面只是在安装的库在/usr/local/lib(用户默认安装路径)下的情况,可以按照自己的实际情况进行更改。
不只是在新安装库之后使用,其实在每一次更新库之后都ldconfig一下会比较好。
参考博客:关于程序运行时加载动态库失败的解决方法