我有目标库的符号链接:
~/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有以下args:
-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
如果我在libopenblas_df029.so.0
下创建了一个符号链接/home/user/opt/OpenBLAS/lib
,那么它将有效。
任何人都可以向我解释为什么会发生这种情况,我该如何改变这种行为? 这是否意味着libopenblas包含一些后缀,并且OS在尝试查找lib文件时总是附加此后缀?
答案 0 :(得分:0)
我认为,你的图书馆" 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
答案 1 :(得分:0)
就像@ Icarus3所说,链接的可执行文件包含要调用的库的名称( SONAME )。
应该有一个从该名称到实际共享库的符号链接。如果缺少,则表示库未正确安装 - 通常表明您需要运行ldconfig
来更新符号链接和动态链接器缓存。