【问题标题】:clang 3.8+ -fopenmp on linux: ld cannot find -lomplinux上的clang 3.8+ -fopenmp:ld找不到-lomp
【发布时间】:2016-11-09 01:46:42
【问题描述】:

我已经从 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 库呢?我在我的系统上的任何地方都没有看到这个库。

【问题讨论】:

标签: linux clang openmp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您正确安装了 libomp,则需要使用 -fopenmp=libomplibgomp 用于 gcc。您可以检查一下,clang 没有符号链接到您计算机上的 gcc。

    【讨论】:

      【解决方案3】:

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

      • 安装 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
      

      待办事项

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-19
        • 1970-01-01
        • 2021-06-07
        • 2022-07-13
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多