linux上的clang 3.8+ -fopenmp:ld找不到-lomp

时间:2016-07-06 20:56:48

标签: linux clang openmp

我已经从Debian Jessie和Fedora 24的基本存储库安装了clang 3.8。当我尝试用clang ++编译一个简单的HelloWorld.cpp测试程序时,我传递-fopenmp标志,在这两种情况下我得到相同的错误:

/ usr / bin / ld:找不到-lomp clang-3.8:错误:链接器命令失败,退出代码为1(使用-v查看调用)

我看到如果我改为传递-fopenmp = libgomp,它就可以了。但是,Clang OpenMP网站表示OpenMP运行时随Clang 3.8一起提供。那么,为什么它找不到默认的libomp库呢?我在系统的任何地方都没有看到这个库。

3 个答案:

答案 0 :(得分:1)

您的系统很可能缺少OpenMP开发包 在Ubuntu上:sudo apt install libomp-dev

答案 1 :(得分:0)

如果您正确安装了libomp,则需要使用-fopenmp=libomplibgomp适用于gcc。您可能会检查铿锵声是否与计算机上的gcc符号链接。

答案 2 :(得分:0)

TL;DR

如果您在诸如 libomp.so make file /usr/lib/llvm-12/lib 之类的地方有 /etc/ld.so.conf.d/libomp.conf for llvm,其中包含行 /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

因此,我在 llvm-libomp-12 目录中创建了一个配置 /etc/ld.so.conf.d,如下所示:

$ 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_PATHecho $LD_LIBRARY_PATH 的关系。您可能没有默认设置。添加此变量的路径,每个路径以冒号分隔。

对于您当前的 shell 会话,只需像这样(假设 bash、zsh 或 fish >v3.0)附加或前置到您的 $LD_LIBRARY_PATH

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 的包,它可以为我机器上的文件编制索引并允许您搜索它们。

  • 安装 mlocate
    • sudo apt install mlocate
  • 更新索引
    • sudo updatedb
  • 搜索子串
    • locate libomp.so

当我搜索 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

待办事项

可以添加到此问题的一些注释:

  • 确认并列出环境变量、配置文件和标志的优先级(这在编译器和链接器之间是否有所不同?)
  • 在使用多个配置文件时对库路径进行排序(我们可以用数字作为前缀以确保解析顺序库吗?)