linux - gcc -llibname 和操作系统如何找到 lib 路径?

标签 linux gcc

我有指向目标库的符号链接(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/

相关文章:

linux - 用户目录 "End of script output before headers"中的 Apache CGI

python - 我无法自动运行脚本 (cron) Raspberry Pi

c - Fork()ing 并在特定的一组 CPU 上运行

c++ - 为英特尔 C++ Composer "GCC not found"设置环境变量时出现问题

linux - 打印包含某个单词的所有行恰好 k 次

linux - 是否可以将 wpa_supplicant.conf 转换为 NetworkManager?

c++ - 为什么 Visual C++ 无法编译继承自私有(private)嵌套类的友元模板?

c++ - c++ 中的 gcc 浮点指针转换导致 SIGBUS 错误

c++ - push_back() "new"一个对象在添加到 c++ 中的 std::list 之前

c++ - vs2017 输出错误但 mingw 有效