编译小tips——安装库的问题

遇到了两个小小的问题,但不好找到思路,这里记录一下。


问题一 强制静态链接或强制动态链接

在默认情况下,如果同时存在 lib.so 和 lib.a ,则将采取动态链接,那么如何强制某一种链接呢?

这里要用到GCC和LD编译过程的命令,假设我们有libA需要静态链接,libB需要动态链接,另有一个libC,我们可以使用如下命令:

gcc ... -Wl,-Bstatic -lA -Wl,-Bdynamic -lB ... -lC

按照指定-B即可确定链接方式,但问题来了:libC将采取与他最近的链接方式强制进行。这就很不好了...所以最好的办法还是分别进行连接,比如在LDFLAGS中进行区别。

参考知乎:在Linux下,如何强制让GCC静态链接?

问题二 程序运行时动态库加载失败

新安装的动态库总是不能被立即找到,比较有经验的同学可能会试用一下 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一下会比较好。

参考博客:关于程序运行时加载动态库失败的解决方法

你可能感兴趣的:(编译小tips——安装库的问题)