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.5和gcc 4.9.2
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的硬路径,然后你从它下面移动了库.
| 归档时间: |
|
| 查看次数: |
5985 次 |
| 最近记录: |