gcc -llibname和OS如何找到lib路径?

时间:2014-07-09 20:23:14

标签: linux gcc

我有目标库的符号链接:

~/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文件时总是附加此后缀?

2 个答案:

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