2016-08-18 272 views
1

我尝试使用这个库无法打开共享对象文件:没有这样的文件或目录的错误,而有文件

我遵循这个网站创建共享库和编译我的main.chttp://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

我给这些命令:

gcc -fPIC -c *.c 
gcc -shared -Wl,-rpath,/opt/lib -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o 
sudo mv libctest.so.1.0 /opt/lib 
sudo ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so 
sudo ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1 
gcc -Wall -L/opt/lib main.c -lctest -o prog 

命令没有给出错误。当我执行的二进制文件./prog它给./prog: error while loading shared libraries: libctest.so.1: cannot open shared object file: No such file or directory

libctest.so.1/opt/lib

lrwxrwxrwx 1 root root 24 Aug 18 17:06 libctest.so -> /opt/lib/libctest.so.1.0 
lrwxrwxrwx 1 root root 24 Aug 18 17:06 libctest.so.1 -> /opt/lib/libctest.so.1.0 
-rwxr-xr-x 1 user user 7064 Aug 18 17:05 libctest.so.1.0 

而且ldd prog

linux-vdso.so.1 (0x00007ffe0f559000) 
libctest.so.1 => not found 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcd27fc6000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fcd28371000) 

这样有什么不好?

我用debian 8.5gcc 4.9.2

+2

您可以使用链接器'-rpath'选项来指定可执行文件搜索库的其他位置,而不是将它们移动。# – gilez

+0

谢谢@gilez'rpath'解决了我的问题。如果您发布ypur评论作为答案,我会接受。 – user4757345

+0

我将我的评论扩展为一个答案,但正如我所说,我现在有点困惑。你仍然有问题,还是这一切工作? – gilez

回答

3

GCC的ld命令有一个--rpath选项,可以解决你的问题:

-rpath=dir 
     Add a directory to the runtime library search path. 

您应该在编译库的添加位置GCC的命令行编译时prog,通过-wl选项:

-Wl,option 
     Pass option as an option to the linker. If option contains commas, 
     it is split into multiple options at the commas. 

所以,你的搜索路径已经包括/opt/lib因为独创库:

-Wl,-rpath,/opt/lib 

对于第二编译,加libctest.so.1.0位置作为另一个rpath,并且应该发现没有你的需要来移动文件:

gcc -Wall -L/opt/lib main.c -lctest -Wl,-rpath,/you/dir/name -o prog 

我想你原来的努力失败了,因为链接器已经包含了一条到你原来的外部目录的硬路径,然后你从它下面移动了图书馆。

2

尝试增加的/ opt/lib添加到如下LD_LIBRARY_PATH;

LD_LIBRARY_PATH=/opt/lib 
+1

设置'LD_LIBRARY_PATH'具有明显的“污染”所有子进程的缺点。当你控制最终的链接时,一个更好的解决方案是将'-Wl,-rpath =/opt/lib'添加到链接命令中。 –

1

我有iccxml

iccToXml profile.icc profile.xml 

相同proplem当我转换* .icc为* .XML由上述代码中,我recived相同的消息:不能打开共享对象文件:没有这样的文件或目录,详细:

iccToXml: error while loading shared libraries: libIccXML.so.2: cannot open shared object file: No such file or directory 

我使用解决了这个命令之前转换

export LD_LIBRARY_PATH="/usr/local/lib" 

您可以用所需的应用程序文件路径替换“/ usr/local/lib”。

希望对你有所帮助。

相关问题