解决Linux编译中”库”找不到它”依赖”的问题
记得我还很年轻的时候,不懂事,居然去碰了Linux…
一碰傻2年, 两年后我果断去了深圳,再也没碰linux了,玩起了单片机和ARM后来随着年龄的增长,我回到了厦门,重新捡起了Linux,生活是多么的不容易啊!有一次交叉编译一个应用程序它依赖于libnats.so(这玩意是一个通讯总线类似mqtt但比mqtt更强大)但这个libnats.so在编译过程中又依赖一个叫libcrypto.so.1.1 和 libssl.so.1.1的库提示:
/usr/lib/gcc-cross/aarch64-linux-gnu/5/../../../../aarch64-linux-gnu/bin/ld: warning: libssl.so.1.1, needed by /opt/arm-libs/arm64/lib/libnats.so, not found (try using -rpath or -rpath-link)
/usr/lib/gcc-cross/aarch64-linux-gnu/5/../../../../aarch64-linux-gnu/bin/ld: warning: libcrypto.so.1.1, needed by /opt/arm-libs/arm64/lib/libnats.so, not found (try using -rpath or -rpath-link)
/opt/arm-libs/arm64/lib/libnats.so:对‘SSL_CTX_use_certificate_chain_file@OPENSSL_1_1_0’未定义的引用
/opt/arm-libs/arm64/lib/libnats.so:对‘OPENSSL_init_ssl@OPENSSL_1_1_0’未定义的引用
/opt/arm-libs/arm64/lib/libnats.so:对‘X509_get_issuer_name@OPENSSL_1_1_0’未定义的引用
不知道啥心情,明明libcrypto.so.1.1 和 libssl.so.1.1就在指定的目录下,文件格式、属性都正确,居然说找不到简直就抓狂。。。我也居然自己下了一个openssl-1.1.0k.tar.gz自己编译起来, 这玩意真生成Make的方式真特别,不提了,说多了都是泪(我前面的日志中有写)其实没明白gcc编译的一些隐含的工作原理,再怎么折腾都是瞎折腾。。。
好了废话不多说!进入/etc/ld.so.conf.d
boen@ubuntu:~/project/nats.c-1.8.0/build/arm64$ ls /etc/ld.so.conf.d/ arm64_local_lib.conf fakeroot-x86_64-linux-gnu.conf libc.conf vmware-tools-libraries.conf x86_64-linux-gnu.conf zz_i386-biarch-compat.conf zz_x32-biarch-compat.conf
可以看到很多文件对不对? 这些就是ld在链接过程中会去搜索的配制文件。因为我的库都放在/opt/arm-libs/arm64/lib/
于是:boen@ubuntu:~/project/nats.c-1.8.0/build/arm64$ cat /etc/ld.so.conf.d/arm64_local_lib.conf /opt/arm-libs/arm64/lib
创建arm64_local_lib.conf 这个配制文件,不用管文件名,但扩展名一定要是.conf
然后切记执行一下sudo ldconfig
然后再去编译你的工程,上帝。。。。那烦人的链接错误终于消失了