无法打开共享对象文件:存在文件时没有此类文件或目录错误

use*_*345 1 c linux shared-libraries

我尝试创建共享库并main.c使用此库编译我

我关注这个网站:http://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
Run Code Online (Sandbox Code Playgroud)

命令没有错误.当我执行二进制文件时,./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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

怎么回事?

我用过debian 8.5gcc 4.9.2

gil*_*lez 5

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

-rpath=dir
       Add a directory to the runtime library search path.
Run Code Online (Sandbox Code Playgroud)

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

-Wl,option
       Pass option as an option to the linker. If option contains commas,
       it is split into multiple options at the commas.
Run Code Online (Sandbox Code Playgroud)

因此,您的搜索路径已包含/opt/lib因为库的原始创建:

-Wl,-rpath,/opt/lib
Run Code Online (Sandbox Code Playgroud)

对于第二次编译,添加libctest.so.1.0另一个的位置,rpath应该在不需要移动文件的情况下找到它:

gcc -Wall -L/opt/lib main.c -lctest -Wl,-rpath,/you/dir/name -o prog
Run Code Online (Sandbox Code Playgroud)

我认为你原来的努力失败了,因为链接器已经包含了原始outout dir的硬路径,然后你从它下面移动了库.