Ste*_*ing 16 debian build find shared-objects
我正在尝试编译这里找到的项目之一USB-I2C/SPI/GPIO接口适配器.
我下载了i2c_bridge-0.0.1-rc2.tgz
包.我安装了libusb
,似乎没有任何问题.我进入i2c_bridge-0.0.1-rc2/
目录并制作.编译.我进入i2c_bridge-0.0.1-rc2/i2c
文件夹并制作.它编译并给我./i2c
.但是,当我运行它时,它说error while loading shared libraries: libi2cbrdg.so: cannot open shared object file: No such file or directory
makefile中i2c_bridge-0.0.1-rc2/i2c
的库目录为../
.在libi2cbrdg.so
此目录中(i2c_bridge-0.0.1-rc2
).我也把文件复制到了/usr/local/lib
.一个ls
在的i2c_bridge-0.0.1-rc2/
目录
i2c i2cbrdg.d i2cbrdg.o libi2cbrdg.a Makefile tests
i2cbrdg.c i2cbrdg.h INSTALL libi2cbrdg.so README u2c4all.sh
Run Code Online (Sandbox Code Playgroud)
(那i2c
是一个目录)
如果我sudo ./i2c
,它仍然给我问题.
我不得不在所有makefile中删除-Werror
和-noWdecrepated
(拼写?)选项以使它们进行编译,但这不应该影响它吗?
找到.so
文件还需要什么?如果有人能帮我找出问题所以我会非常感激.如果需要更多信息,我可以发布.
thi*_*ton 39
你必须区分在编译时和运行时找到它们.您在编译时提供的-L标志与在运行时本地化库无关.这是通过嵌入库中的许多变量和一些路径来完成的.
解决此问题的最佳方法是将LD_LIBRARY_PATH设置为带有.so文件的目录,例如:
$ LD_LIBRARY_PATH=.. ./i2c
Run Code Online (Sandbox Code Playgroud)
对于长期解决方案,您需要仔细查看具有rpath和runpath的整个LD系统,或者使用libtool(它可以为您解决这些问题).
将文件复制到/ usr/local/lib通常是不够的,因为ld会缓存可用的库,因此在将库复制到/ usr/local/lib之后需要重新运行ldconfig(以root身份运行).
rak*_*ice 25
如果要从源代码构建需要库的代码,可以在构建之前将库所在的路径放在环境变量LD_RUN_PATH中,链接器会将该路径保存到二进制文件中,以便自动查找因为在运行时的正确位置.
Linux特有的:或者,把库中/lib
,/usr/lib
或一些其他的路径在您的引用/etc/ld.so.conf
或它的进口配置片段,然后将所有你需要做的就是运行/sbin/ldconfig
刷新ld.so(动态连接器)的库高速缓存.
这适用于我的问题,希望对任何人都有帮助。
gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg
Run Code Online (Sandbox Code Playgroud)
选择-Wl,-rpath
是关键技巧。
归档时间: |
|
查看次数: |
47090 次 |
最近记录: |