我有一个指向目标库的符号链接:
~/opt/OpenBLAS/lib $ ls -al
total 0
drwxrwxr-x 2 user user 59 Jul 9 13:03 .
drwxrwxr-x 5 user user 147 Jul 9 12:48 ..
lrwxrwxrwx 1 user user 64 Jul 9 13:03 libopenblas.a -> ../openBLAS_v0.2.9df/lib/libopenblas_df029_sandybridgep-r0.2.9.a
lrwxrwxrwx 1 user user 65 Jul 9 13:03 libopenblas.so -> ../openBLAS_v0.2.9df/lib/libopenblas_df029_sandybridgep-r0.2.9.so
$ echo $LD_LIBRARY_PATH
/home/user/opt/OpenBLAS/lib
gcc有以下参数:
-L/home/user/opt/OpenBLAS/lib -lopenblas
但是,在编译后,运行命令它总是抛出错误:
error while loading shared libraries: libopenblas_df029.so.0: cannot open shared object file: No such file or directory
如果我在/home/user/opt/OpenBLAS/lib
下创建一个符号链接libopenblas_df029.so.0
,它就会工作。
有谁能给我解释一下为什么会发生这种情况,我该如何改变这种行为?这是否意味着libopenblas包含一些后缀,并且操作系统在试图查找lib文件时总是附加这个后缀?
我想,你的库"libopenblas_df029_sandybridge -r0.2.9。所以"是用"-soname"开关编译的
类似:
gcc -shared -Wl,-soname,libopenblas_df029.so.0 source.c -o libopenblas_df029_sandybridgep-r0.2.9.so
当您链接到这样的库时,您的可执行文件试图通过名称"libopenblas_df029.so"找到库。
查找是否为真最好的方法是运行以下命令并查找"SONAME"
readelf -d <shared_object> | head -10
就像@Icarus3说的,链接的可执行文件包含库的名称,因为它希望被调用(SONAME)。
应该有一个从该名称到实际共享库的符号链接。如果它缺失,则库没有正确安装-通常这是一个信号,您需要运行ldconfig
来更新符号链接和动态链接器缓存。