2014-07-09 21 views
1

我不得不符号链接到目标库:gcc -llibname和OS如何找到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 

$回声$ 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 

如果我在/home/user/opt/OpenBLAS/lib下创建了一个符号链接libopenblas_df029.so.0,它将会起作用。

任何人都可以向我解释为什么会发生这种情况,我该如何改变行为? 这是否意味着libopenblas包含一些后缀,并且操作系统在尝试查找lib文件时总是附加这个后缀?

回答

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 
0

就像@ Icarus3所说的,链接的可执行文件包含想要调用的库的名称(SONAME)。

应该有一个从该名称到实际共享库的符号链接。如果缺失,库没有正确安装 - 通常这是一个迹象表明您需要运行ldconfig来更新符号链接和动态链接器缓存。