编译期间未找到共享库
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
.
所以我得到了几个共享库,我试图将它们永久安装在我的 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
.