所以我有几个共享库,我试图在我的Ubuntu系统上永久安装,但我遇到了一些困难。
我想将库和标题安装在/usr/local/lib
和/usr/local/include
下的单独文件夹中(例如名为agony
的文件夹),这样它就会干净并删除它们只是要求我删除这些文件夹。所以它看起来像这样:
/usr/local/lib/agony/libbtiGPIO.so
/usr/local/lib/agony/libbtiDSP.so
...
/usr/local/include/agony/GPIO.h
/usr/local/include/agony/DSP.h
...
我在这里添加了一个文件/etc/ld.so.conf.d/agony.conf
,其中包含一行描述库文件夹的路径:
$ cat /etc/ld.so.conf.d/agony.conf
/usr/local/lib/agony
我执行sudo ldconfig
来更新库数据库。
因此,要仔细检查是否找到了库,我会ldconfig -p | grep bti*
和。{
我看到以下结果:
$ ldconfig -p | grep bti
...
libbtiGPIO.so (libc6,x86-64) => /usr/local/lib/agony/libbtiGPIO.so
libbtiDSP.so (libc6,x86-64) => /usr/local/lib/agony/libbtiDSP.so
...
此时我应该可以在不指定库路径的情况下使用这些库。但是当我尝试在不提供库路径(-L)的情况下编译应用程序时,它会失败。但是,当我向gcc
提供库路径ex:
gcc source.c -L /usr/local/lib/agony output -lbtiGPIO -lbtiDSP
它有效!!
我不想使用LD_LIBRARY_PATH
环境变量,因为这个库将在系统的任何地方使用,我不希望其他编译器担心提供{{1}}。
我在这里做错了什么?
答案 0 :(得分:1)
此时我应该可以在不指定库路径的情况下使用库
这就是混乱。
您已经构建了共享库libbtiGPIO.so
(只需坚持使用该库),
将其放在/usr/local/lib/agony
中,并相应地更新ldconfig
数据库。
当你运行一个 与libbtiGPIO
链接的程序时,效果就是
然后动态链接器(/lib/x86_64-linux-gnu/ld-2.21.so
或类似的)将知道在哪里看
将该库加载到流程中,您无需通过在环境中设置LD_LIBRARY_PATH
来告知它。
但是,您没有做任何影响默认库列表的事情
搜索硬连线到您传递给gcc
的版本的目录
链接器(/usr/bin/ld
)在您首先链接程序时使用libbtiGPIO
。
如果你做了一个详细的话,你会找到默认搜索目录列表
构建您的计划 - gcc -v ...
- 然后选择LIBRARY_PATH
的值
从输出中,例如
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:\
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:\
/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:\
/lib/x86_64-linux-gnu/:\
/lib/../lib/:\
/usr/lib/x86_64-linux-gnu/:\
/usr/lib/../lib/:\
/usr/lib/gcc/x86_64-linux-gnu/5/../../../:\
/lib/:\
/usr/lib
/usr/local/lib/agony
不是其中之一,而是让你成为其中之一
必须自己从源代码构建gcc
。因此,为了链接你的
使用libbtiGPIO
的程序,您仍然需要告诉ld
在哪里找到它
-L/usr/local/lib/agony -lbtiGPIO
。
答案 1 :(得分:0)
首先, libbtiGPIO.so 是共享链接库,而不是静态链接库。了解这些差异很重要。
然后你需要了解别的东西。更改 ld.so.conf.d / * .conf 并运行 sudo ldconfig ,它会影响链接的过程。换句话说,如果你没有添加agony.conf和 sudo ldconfig ,当你运行 ./ a.out 而不是时会收到错误> gcc source.c -L .... ,即使你没有ldconfig,gcc命令也可以成功运行。
最后,如果您没有污染LD_LIBRARY_PATH环境变量,则必须在gcc命令中添加-L ...选项。更重要的是,如果您不想经常在shell中输入太多单词,您可以学习使用Makefile。