TL;DR
如果您在 /usr/lib/llvm-12/lib 之类的某个地方有用于 llvm 的 libomp.so 生成文件 /etc/ld.so.conf.d/libomp.conf,其中包含 /usr/lib/llvm-12/lib 行,然后运行 sudo ldconfig。
简介
就我而言,我安装了 libomp-12-dev,但它不在链接器的库路径中。请参阅有关我如何找到该库的脚注。在这种情况下有几个解决方案:
用ldconfig添加库路径
如果您希望在默认库路径中使用它,请考虑使用ldconfig [man page]。
这将在/etc/ld.so.conf 中查找文件。对我来说,运行 Ubuntu 20.04,这个文件只指向包含目录 /etc/ld.so.conf.d 中的文件。
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
因此,我在 /etc/ld.so.conf.d 目录中创建了一个配置 llvm-libomp-12,如下所示:
$ cat /etc/ld.so.conf.d/libomp.conf
# libomp.so for llvm
/usr/lib/llvm-12/lib
然后我让 ldconfig 用sudo ldconfig 更新路径。您可以添加-v 标志,它将打印它知道的所有库和路径。
将库添加到环境变量
我们还可以使用$LD_LIBRARY_PATH 环境变量将链接器指向我们的库
如果您在多用户系统上并且不想影响其他人,或者如果您想在 shell 中对库路径进行临时更改,这可能会很有优势。
查看您当前的$LD_LIBRARY_PATH 和echo $LD_LIBRARY_PATH。默认情况下,您可能没有此设置。向此变量添加路径,每个路径用冒号分隔。
对于您当前的 shell 会话,只需像这样附加或添加到您的 $LD_LIBRARY_PATH(假设 bash、zsh 或 fish >v3.0):
export "$LD_LIBRARY_PATH:/path/to/lib"
或者对于仅限于您的用户的更永久的更改,将上述导出添加到您的 shell 的配置文件(例如~/.bashrc)。
在编译器标志中手动指定库路径
非常适合您并不总是希望在默认库路径中出现的一次性特定库。将库的路径指定为这样的标志:
-L/path/to/lib
例如:
clang++ -L/usr/lib/llvm-12/lib [...]
make -L/usr/lib/llvm-12/lib
脚注
关于搜索
如果您不知道您需要的给定库在哪里,您可以使用find 之类的东西。不过,就我个人而言,我使用了一个名为 mlocate 的包,它可以索引我机器上的文件并允许您搜索它们。
当我搜索我的 libomp 库的位置时,我这样做了:
$ locate libomp.so
/usr/lib/llvm-12/lib/libomp.so
/usr/lib/llvm-12/lib/libomp.so.5
/usr/lib/x86_64-linux-gnu/libomp.so.5
值得注意的是,clang 似乎在使用 linux-gnu 目录中的 libomp.so.5,但我需要它来使用 llvm 库。
本文使用的环境
$ lsb_release --all
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
$ uname -a
Linux bip 5.8.0-48-generic #54~20.04.1-Ubuntu SMP Sat Mar 20 13:40:25 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
待办事项
可以添加到这个问题的一些注释:
- 确认并列出环境变量、配置文件和标志的优先级(编译器和链接器之间是否有所不同?)
- 使用多个配置文件时排序库路径(我们可以用数字前缀以确保解析排序库吗?)