使用共享对象文件
Posted
技术标签:
【中文标题】使用共享对象文件【英文标题】:Using Shared Object Files 【发布时间】:2014-02-27 19:31:21 【问题描述】:我使用 cmake 在 ubuntu 12.04 上安装了 opencv 2.4.3。安装时,.so 文件放在 /usr/local/lib 目录中。当我使用 .so 文件的默认位置(即 /usr/local/lib)在终端中使用以下行编译我的代码时,它可以正常工作
g++ fileName.cpp -lopencv_core -lopencv_highgui -lopencv_imgproc
我正在尝试。我从 /usr/local/bin 复制了所需的共享对象文件,并将它们放在新文件夹位置 /home/nishant/Desktop/lib 中。我复制了以下文件及其各自的 .so.2.4 和 .so.2.4.3 文件: 1) libopencv_core.so 2) libopencv_highgui.so 3) libopencv_imgproc.so
然后我分别将名称更改为 libcore.so 、 libhighgui.so 和 libimgproc.so 。我更改了它们的名称,以便不应该从 /usr/local/lib 使用旧的 .so 文件。现在,当我尝试使用新文件夹位置中的共享对象文件编译我的代码时,我收到以下错误: 终端命令:
g++ filename.cpp -L/home/nishant/Desktop/lib -lcore -lhighgui -limgproc
错误:
/usr/bin/ld: cannot find -lcore
/usr/bin/ld: cannot find -lhighgui
/usr/bin/ld: cannot find -limgproc
collect2: ld returned 1 exit status
有趣的是,以下工作:
g++ filename.cpp -L/home/nishant/Desktop/lib -lopencv_core -lopencv_highgui -lopencv_imgproc
原因:正在使用 /usr/local/lib 中的 .so 文件。 我的问题:如何使用新文件夹位置中的 .so 文件来使我的代码正常工作。
【问题讨论】:
你确定 /home/nishant/Desktop/lib/libcore.so 是实际的库文件,或者如果不是,符号链接指向正确的路径?如果您只是重命名符号链接,您将不会更改它们的目标,您将必须重新创建指向重命名目标的链接。使用ls -l
列出符号链接目标。
【参考方案1】:
我看到了三种方式:
1。
请更新您的 LD_LIBRARY_PATH
- 在运行 g++
之前添加库路径。
2。
请将您的库所在的目录添加到/etc/ld.so.conf
并运行:
sudo ldconfig
然后运行g++
。
3。
请创建一个新文件:/etc/ld.so.conf.d/local.conf
并添加包含您的库的目录的路径并运行:
sudo ldconfig
然后运行 g++。
【讨论】:
以上是关于使用共享对象文件的主要内容,如果未能解决你的问题,请参考以下文章
在 Android Studio 中使用 .so(共享对象)文件
加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)
Roslaunch 无法打开共享对象文件:没有这样的文件或目录
加载共享库时出错:libgfortran.so.1:无法打开共享对象文件:没有这样的文件或目录