我有指向目标库的符号链接(symbolic link):
~/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
下创建一个符号链接(symbolic link) libopenblas_df029.so.0
,它就会工作。
谁能向我解释为什么会这样,我该如何改变这种行为? 这是否意味着 libopenblas 包含一些后缀,并且操作系统在尝试查找 lib 文件时总是附加此后缀?
最佳答案
我认为,您的库“libopenblas_df029_sandybridgep-r0.2.9.so”是使用“-soname”开关编译的
类似于:
gcc -shared -Wl,-soname,libopenblas_df029.so.0 source.c -o libopenblas_df029_sandybridgep-r0.2.9.so
当您链接此类库时,您的可执行文件会尝试按名称“libopenblas_df029.so.0”查找库(即您在 -soname 开关中指定的任何名称)
确定这是否属实的最佳方法是运行以下命令并查找“SONAME”
readelf -d <shared_object> | head -10
关于linux - gcc -llibname 和操作系统如何找到 lib 路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663159/