编译期间未找到共享库

shared library not found during compilation

所以我得到了几个共享库,我试图将它们永久安装在我的 Ubuntu 系统上,但我在使用它时遇到了一些困难。

我想将库和 headers 安装在 /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 环境变量,因为这个库将在系统的任何地方使用,我不希望其他编译器担心提供 LD_LIBRARY_PATH

我做错了什么?

老兄,你误解了complier的程序和link。

首先,libbtiGPIO.so 是共享 link 库,而不是静态 link 库。了解这些差异很重要。

那你还需要知道点别的。更改 ld.so.conf.d/*.conf 和 运行 sudo ldconfig,它会影响 link 的过程。换句话说,如果你不添加 agony.conf 和 sudo ldconfig,当你 运行 ./a.out 而不是 gcc source.c -L ....,gcc 命令可以 运行 成功,即使你没有 ldconfig .

最后,如果你不污染 LD_LIBRARY_PATH 环境变量,你必须在你的 gcc 命令中添加 -L ... 选项。另外,如果你不想在你的 shell 中经常输入太多的单词,你可以学习使用 Makefile。

At this point I should be able to use the libraries without specifying the library path

困惑就在这里。

您已经构建了您的共享库 libbtiGPIO.so(只是坚持使用那个), 将它放在 /usr/local/lib/agony 中,并相应地更新 ldconfig 数据库。

当您 运行 一个 已经 link 的程序 link 时

=14=] 那么动态 linker(/lib/x86_64-linux-gnu/ld-2.21.so 或类似的)就会知道去哪里找 将该库加载到进程中,您不需要通过在环境中设置 LD_LIBRARY_PATH 来告诉它。

但是,您还没有做任何影响默认库列表的事情 搜索硬连接到您的 gcc 构建中的目录,它传递给 linker (/usr/bin/ld) 当你 link 一个首先带有 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。因此,为了 link 你的 使用 libbtiGPIO 编程你仍然需要告诉 ld 在哪里可以找到它 -L/usr/local/lib/agony -lbtiGPIO.