编译期间找不到共享库

时间:2016-04-19 20:47:18

标签: linux shared-libraries

所以我有几个共享库,我试图在我的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}}。

我在这里做错了什么?

2 个答案:

答案 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。