首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >clang 3.8+ -fopenmp on linux: ld找不到-lomp

clang 3.8+ -fopenmp on linux: ld找不到-lomp
EN

Stack Overflow用户
提问于 2016-07-07 04:56:48
回答 3查看 5.4K关注 0票数 10

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

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

我看到,如果我传递-fopenmp=libgomp,它就能工作。然而,Clang OpenMP网站上说,OpenMP运行时随clang3.8一起提供。那么,为什么它找不到默认的libomp库呢?在我的系统中,我没有看到这个库。

EN

回答 3

Stack Overflow用户

发布于 2018-04-03 16:39:53

您的系统上很可能缺少OpenMP开发包。

在Ubuntu上:sudo apt install libomp-dev

票数 4
EN

Stack Overflow用户

发布于 2018-03-14 04:35:25

如果你已经正确安装了libomp,你将需要使用-fopenmp=libomplibgomp是给gcc的。你可能会检查一下,在你的电脑上,clang并没有象征性地链接到gcc。

票数 0
EN

Stack Overflow用户

发布于 2021-04-10 06:20:11

TL;DR

如果在像/usr/lib/llvm-12/lib这样的地方有用于llvm的libomp.so,那么可以运行sudo ldconfig

简介

在我的例子中,我安装了libomp 12-dev,但它不在我的链接器的库路径中。请参阅我如何找到该库的脚注。在此场景中有几种解决方案:

使用ldconfig添加库路径

如果要将其放在默认库路径中,请考虑使用ldconfig

这将在/etc/ld.so.conf中查找文件。对于运行Ubuntu20.04的我来说,这个文件只指向包含目录/etc/ld.so.conf.d中的文件。

代码语言:javascript
运行
复制
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

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

代码语言:javascript
运行
复制
$ 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中临时更改库路径,这可能会很有好处。

使用echo $LD_LIBRARY_PATH查看您当前的$LD_LIBRARY_PATH。默认情况下,您可能没有此设置。将路径添加到此变量,每个路径由冒号分隔。

对于当前的shell会话,只需像下面这样附加或预先添加到$LD_LIBRARY_PATH中(假设bash、zsh或fish >v3.0):

代码语言:javascript
运行
复制
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库的位置时,我这样做:

代码语言:javascript
运行
复制
$ 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目录中的libonp.so.5,但我需要它使用llvm库。

本文中使用的环境

代码语言:javascript
运行
复制
$ 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

待办事项

可以添加到这个问题中的一些注意事项:

  • 确认并列出环境变量、配置文件和标志的优先级(在使用多个配置文件时,这在编译器和linkers?)
  • Ordering库路径之间是否会有所不同(我们可以在前面加上数字以确保库被解析的顺序吗?)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38233646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档