启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误

Posted

技术标签:

【中文标题】启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误【英文标题】:Error enabling openmp - "ld: library not found for -lgomp" and Clang errors 【发布时间】:2013-12-17 18:55:47 【问题描述】:

我正在尝试让 openmp 在 Mavericks 上的程序中运行,但是当我尝试使用标志 -fopenmp 进行编译时,我收到以下错误:

ld: library not found for -lgomp
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我正在运行的命令是:

gcc myProgram.cpp -fopenmp -o myProgram

另外,当我运行 gcc 时,我会收到 Clang 警告,我觉得这很奇怪。并且查看 /usr/bin/gcc 它似乎没有链接到 Clang。

关于如何修复我的 Clang 错误并让 openmp 编译的任何建议?

【问题讨论】:

你确定是gcc?你能查一下gcc --version吗? 是的,我很确定:$gcc --version 配置为:--prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir= /usr/include/c++/4.2.1 Apple LLVM 5.0 版(clang-500.2.79)(基于 LLVM 3.3svn)目标:x86_64-apple-darwin13.0.0 线程模型:posix` 版本格式类似于clang使用的一种,它提到了LLVM和clang;也许dragonegg的行为方式是这样,但我对此表示怀疑(从未见过 - 抱歉)。不幸的是,我没有使用 osx 的经验,只能说 clang 还不能与 openmp 一起使用这个简单的事实——它的参与似乎是你问题的根源。无论如何,如果--version 没有说它是 FSF 的 gcc - 那么我认为它不是。 相关,对于支持 OpenMP 的编译器,这里是 3 秒教程:How to Compile and Run an OpenMP Program。 【参考方案1】:

刚刚解决了这个问题。这是答案以及如何使用 Xcode。

    从以下位置获取最新版本的 openMP 运行时库 https://www.openmprtl.org/download

    解压并编译

     mkdir build && cd build && cmake .. && make && sudo make install 
    

    安装它

     sudo cp ./libiomp5.dylib /usr/lib/
     sudo cp ./omp.h /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/
    

    按照http://clang-omp.github.io/ 上的说明从 Git 获取 openmp/clang

    编译 openmp/clang

     cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j
     sudo make install
    

    通常它会将 clang/clang++ 安装到 /usr/local/bin 中,我们需要将 Apple clang 替换为我们的版本

     cd /usr/bin
     sudo mv clang clang-apple
     sudo mv clang++ clang++-apple
     sudo ln -s /usr/local/bin/clang ./clang
     sudo ln -s /usr/local/bin/clang++ ./clang++
     cd /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
     sudo mv clang clang-apple
     sudo mv clang++ clang++-apple
     sudo ln -s /usr/local/bin/clang ./clang
     sudo ln -s /usr/local/bin/clang++ ./clang++
     cd /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
     sudo mv -f * ../../
    

    在 Xcode 中创建一个项目,使用 clang-openmp 网站上的 Hello World 代码进行测试。创建后,在项目设置中的Custom Compiler Flags -> Other C Flags中添加“-fopenmp”;将/usr/lib/libiomp5.dylib 添加到项目的构建阶段(项目设置-> 构建阶段-> 将/usr/lib/libiomp5.dylib 拖入Link Binary with Libraries)

    它应该工作。 Yosemite + Xcode 6 经过测试。

注意:自定义 clang 不如 Apple 稳定。如果编译后遇到奇怪的指令错误,请切换回来。

【讨论】:

【参考方案2】:

如果你正在运行homebrew,你可以通过调用来解决这个问题:

brew install clang-omp

编译器将在clang-omp++ 名称下可用

【讨论】:

我收到Error: No available formula with the name "clang-omp" 我遇到了同样的问题,无法通过自制软件安装clang-omp,但后来我从***.com/questions/38971394/…找到了解决方案。它帮助我成功安装了 clang-omp。 需要安装配置llvm才能使用。 clang-omp 已被合并到那里。详情请见***.com/a/39843038/1842416。【参考方案3】:

我最近刚刚解决了这个问题,并根据official instructions 编写了让一切正常运行的过程。

该脚本会将所有内容下载到 ~/code 中以便于维护,并将正确的环境变量附加到您的 ~/.profile 文件中。对于高级用户,选择一个你想要安装 lib、bin 和 include 的好位置并手动移动它们。该脚本依赖于了解英特尔最新的 OpenMP 运行时,可以在脚本顶部进行更改。

除了一个小问题外,该脚本应该可以在原版 Mavericks 中开箱即用。在 OpenML 运行时 make 脚本中,它在指定时不能可靠地接受 clang,并继续使用默认的 GCC。因此,如果您没有安装 GCC(这在开箱即用的 Mavericks 中是不正常的),它将无法构建。要解决此问题,您必须根据 OpenMP 的 libomp_20131209_oss.tgz 构建注释掉两行(如脚本中所述)。较新的 OpenML 版本可能会破坏此脚本,因此在较新的版本上使用后果自负。

只需将此脚本保存到文件中,运行“chmod +x filename.sh”,然后从终端运行“./filename.sh”。构建 LLVM 和 Clang 需要一段时间,所以请耐心等待。

编辑:此脚本很可能在 Yosemite 上失败,并且在更新到 OSX 10.10 的开发版本后,我在使用内置的 clang2 时遇到问题。

INTEL_OPENMP_LATEST_BUILD_LINK=https://www.openmprtl.org/sites/default/files/libomp_20131209_oss.tgz
DEST_FOLDER = ~/code
CLANG_INCLUDE=$DEST_FOLDER/llvm/include
CLANG_BIN=$DEST_FOLDER/llvm/build/Debug+Asserts/bin
CLANG_LIB=$DEST_FOLDER/llvm/build/Debug+Asserts/lib
OPENMP_INCLUDE=$DEST_FOLDER/libomp_oss/exports/common/include
OPENMP_LIB=$DEST_FOLDER/libomp_oss/exports/mac_32e/lib.thin

mkdir $DEST_FOLDER
cd $DEST_FOLDER
git clone https://github.com/clang-omp/llvm
git clone https://github.com/clang-omp/compiler-rt llvm/projects/compiler-rt
git clone -b clang-omp https://github.com/clang-omp/clang llvm/tools/clang
cd llvm
mkdir build
cd build
../configure
make
cd Debug+Asserts/bin
mv clang clang2
rm -rf clang++
ln -s clang2 clang2++
echo "LLVM+Clang+OpenMP Include Path : " $CLANG_INCLUDE
echo "LLVM+Clang+OpenMP Bin Path     : " $CLANG_BIN
echo "LLVM+Clang+OpenMP Lib Path     : " $CLANG_LIB

cd $DEST_FOLDER
curl $INTEL_OPENMP_LATEST_BUILD_LINK -o libomp_oss_temp.tgz
gunzip -c libomp_oss_temp.tgz | tar xopf -
rm -rf libomp_oss_temp.tgz
cd libomp_oss

echo "You need to do one or two things:"
echo "1.) [Required] Comment out line 433 from libomp_oss/src/makefile.mk"
echo "2.) [Optional] If you do not have GCC installed (not normal on vanilla Mavericks), you must comment out lines 450-451 in libomp_oss/tools/check-tools.pl.  Have you done this or want to compile anyway?"
select yn in "Yes" "No"; do
    case $yn in
        Yes ) make compiler=clang; break;;
        No ) exit;;
    esac
done

echo "OpenMP Runtime Include Path : " $OPENMP_INCLUDE
echo "OpenMP Runtime Lib Path     : " $OPENMP_LIB

(echo 'export PATH='$CLANG_BIN':$PATH';
    echo 'export C_INCLUDE_PATH='$CLANG_INCLUDE':'$OPENMP_INCLUDE':$C_INCLUDE_PATH'; 
    echo 'export CPLUS_INCLUDE_PATH='$CLANG_INCLUDE':'$OPENMP_INCLUDE':$CPLUS_INCLUDE_PATH';
    echo 'export LIBRARY_PATH='$CLANG_LIB':'$OPENMP_LIB':$LIBRARY_PATH';
    echo 'export DYLD_LIBRARY_PATH='$CLANG_LIB':'$OPENMP_LIB':$DYLD_LIBRARY_PATH') >> ~/.profile
source ~/.profile

echo "LLVM+Clang+OpenMP is now accessible through [ clang2 ] via terminal and does not conflict with Apple's clang"

【讨论】:

您好,尝试使用这个脚本,但我找不到这个文件:~/code/libomp_oss/exports/mac_32e/lib.thin 我检查了,它确实丢失了,实际上我下载了 tgz手动导出目录有很多文件夹但没有文件 可能会将 libiomp5.dylib 放在另一个文件夹中。我不太确定为什么 ../exports/ 中存在所有不同的文件夹,但我会尝试在与 mac_32e 平行的其他文件夹中查找库 我在 osx mavericks 中使用上面的脚本出现以下错误。 @JasonParham 我按照说明安装了clang。但不幸的是我无法编译简单的hello world。我收到了这个错误:$ clang2++ hello.cpp hello.cpp:1:10: fatal error: 'iostream' file not found 你能告诉我如何解决这个问题吗? @Kris 每当我使用 Clang2 构建项目时,我都必须明确包含 stdc++ 库。例如在 CMake 中,我添加以下行: set(CMAKE_C_FLAGS "$CMAKE_C_FLAGS -stdlib=libstdc++") set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -stdlib=libstdc++") set(CMAKE_SHARED_LINKER_FLAGS "$CMAKE_SHARED_LINKER_FLAGS -lstdc++ - stdlib=libstdc++") 设置(CMAKE_EXE_LINKER_FLAGS "$CMAKE_EXE_LINKER_FLAGS -lstdc++ -stdlib=libstdc++")【参考方案4】:

最新 Xcode 套件中的 gcc 命令不再是 LLVM 的 GCC 前端(基于非常旧的 GCC 4.2.1),而是指向 clang 的符号链接。 Clang 不(还)支持 OpenMP。您必须单独安装另一个版本的 GCC,例如关注this tutorial 或使用任何可用的软件包管理系统,如MacPorts 和Homebrew。

【讨论】:

我使用 brew 安装了 gcc49 [brew install gcc49],但 gcc 似乎仍然链接到 Clang。 $g++ --version Configured with: -- prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) Target: x86_64-apple-darwin13.0.0 Thread model: posix我是否必须以某种方式手动设置 gcc 的符号链接才能使用 gcc 4.9 而不是 clang? Homebrew 在/usr/local 中安装软件。确保/usr/local/bin 在您的$PATH 中,并且在/usr/bin 之前。来自 Homebrew 的 GCC 二进制文件也可能带有版本后缀,例如gcc-4.9 而不是简单的 gcc “Clang 不支持 OpenMP”仍然是真的吗。看到这个:clang-omp.github.io 如果我安装这个,你认为它会扰乱 Xcode 5 吗? @RawMean,您是否成功构建和运行 OpenMP/Clang? 是的,编译并构建它。但我仍然无法告诉 Qt 库在哪里

以上是关于启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误的主要内容,如果未能解决你的问题,请参考以下文章

启用分析时禁用 OpenMP

c_cpp 启用BUILD_WITH_OPENMP时如何解决高CPU使用率问题

在 Mac OS X (sierra & Mojave) 中启用 OpenMP 支持

请看看则个fortran结合openmp并行程序,为啥老出错?

使用 openMP 进行多核处理与多线程

使用 clang-cl 用 openmp 编译 C 代码