我试图在Debian上构建一个共享对象库
cat /etc/issue
Debian GNU/Linux 9 \n \l
我正常构建库和对象(wrap.c
用作创建所有目标文件的包装器)
gcc -c -fPIC -W -Wall -O2 -funroll-loops wrap.c
gcc -shared -Wl,-soname,libtest.so -o libtest.so *.o
mv libtest.so /usr/local/lib/ && mv test-header.h /usr/local/include/
然后我创建一个test.c
来拉入库并按如下方式成功编译:
gcc test.c -ltest
但是,运行程序./a.out
会返回以下错误:
./ a.out:加载共享库时出错:libtest.so:无法打开共享对象文件:没有这样的文件或目录
检查.so
,我看到了:
$ ldd /path/to/libtest.so
linux-vdso.so.1 (0x00007ffdb71c5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1c22fba000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1c23560000)
我甚至看不到libtest.so => none
,至少会告诉我它无法找到图书馆。
我不确定这里发生了什么。
我要使用相同的进程(使用.dylib
)在macOS
上成功创建gcc -dynamiclib -o libtest.dylib *.o
,并且我可以在可执行文件中成功调用库。我不确定Debian上有什么不同。
答案 0 :(得分:3)
您已放置的共享库libtest.so
在/usr/local/lib
中将由链接器定位
命令
gcc test.c -ltest
因为/usr/local/lib
是链接器的默认搜索
路径。
但是,运行时加载程序 不会位于那里
当您尝试运行./a.out
因为运行时
loader不会直接搜索目录
变量LD_LIBRARY_PATH
的值中列出的那些,如果有的话,
在当前的环境中。默认情况下,它会搜索库
在ldconfig
注册
缓存,并更新该缓存以注册新出现的库
只能通过运行ldconfig
(以root身份)。
因此,要运行程序,您有两种选择: -
要在当前shell中取得成功,请运行:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib; ./a.out
为了获得持久的成功,请运行:
sudo ldconfig
然后你的程序将在任何shell中运行。
当然,顺便说一句,ldd /path/to/libtest.so
告诉你
libtest.so
的共享库依赖项。那不是
告诉你为什么跑./a.out
失败了
找到/path/to/libtest.so
本身。查看共享库依赖项
在a.out
,运行ldd a.out