构建共享对象库:ldd 不显示指定的名称
building a shared object library: ldd does not show specified name
我正在尝试在 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
returns出现如下错误:
./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
检查 .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
,这至少告诉我它找不到图书馆。
我不太确定这是怎么回事。
我要使用相同的过程(使用 gcc -dynamiclib -o libtest.dylib *.o
)在 macOS
上成功创建 .dylib
,并且我可以在可执行文件中成功调用该库。我不确定 Debian 有什么不同。
您放置的共享库libtest.so
in /usr/local/lib
将由链接器位于
命令
gcc test.c -ltest
因为 /usr/local/lib
是链接器的默认搜索之一
路径。
但是,它不会被运行时间加载程序定位到那里
当您尝试 运行 ./a.out
因为 运行 时间
loader 不直接搜索目录
那些在变量 LD_LIBRARY_PATH
的值中列出的,如果有的话,
在现在的环境下。默认情况下它搜索库
注册于 ldconfig
缓存,并且该缓存被更新以注册新出现的库
仅 运行ning 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
的共享库依赖项。那不是
会告诉你为什么 运行ning ./a.out
失败
找到 /path/to/libtest.so
本身。查看共享库依赖项
共 a.out
、运行 ldd a.out
我正在尝试在 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
returns出现如下错误:
./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
检查 .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
,这至少告诉我它找不到图书馆。
我不太确定这是怎么回事。
我要使用相同的过程(使用 gcc -dynamiclib -o libtest.dylib *.o
)在 macOS
上成功创建 .dylib
,并且我可以在可执行文件中成功调用该库。我不确定 Debian 有什么不同。
您放置的共享库libtest.so
in /usr/local/lib
将由链接器位于
命令
gcc test.c -ltest
因为 /usr/local/lib
是链接器的默认搜索之一
路径。
但是,它不会被运行时间加载程序定位到那里
当您尝试 运行 ./a.out
因为 运行 时间
loader 不直接搜索目录
那些在变量 LD_LIBRARY_PATH
的值中列出的,如果有的话,
在现在的环境下。默认情况下它搜索库
注册于 ldconfig
缓存,并且该缓存被更新以注册新出现的库
仅 运行ning 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
的共享库依赖项。那不是
会告诉你为什么 运行ning ./a.out
失败
找到 /path/to/libtest.so
本身。查看共享库依赖项
共 a.out
、运行 ldd a.out