gcC语言 llibname和操作系统如何查找lib路径



我有一个指向目标库的符号链接:

~/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来更新符号链接和动态链接器缓存。

相关内容

  • 没有找到相关文章