启用openmp时出错 - “ld:找不到-lgomp的库”和Clang错误

时间:2013-12-02 06:17:47

标签: c++ gcc clang openmp osx-mavericks

我正试图让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进行编译的任何建议吗?

4 个答案:

答案 0 :(得分:27)

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

答案 1 :(得分:13)

我最近刚刚攻击了这个问题,并编写了基于official instructions让所有工作正常运行的过程。

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

除了一个小问题外,脚本应该与vanilla 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"

答案 2 :(得分:5)

如果您正在运行homebrew,可以通过调用以下方法解决此问题:

brew install clang-omp

编译器将在clang-omp++名称

下提供

答案 3 :(得分:3)

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

  1. 从中获取最新版本的openMP运行时库 https://www.openmprtl.org/download

  2. 解压缩并按

    编译
    mkdir build && cd build && cmake ..
    
  3. 安装
    sudo cp ./libiomp5.dylib /usr/lib/
    sudo cp ./omp.h /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/
    
  4. 按照http://clang-omp.github.io/

  5. 上的说明从Git抓取openmp / clang
  6. 编译openmp / clang

    cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j
    sudo make install
    
  7. 通常会将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 * ../../
    
  8. 在Xcode中创建一个项目,使用clang-openmp网站上的Hello World代码进行测试。创建后,将“-fopenmp”添加到Custom Compiler Flags - >项目设置中的其他C标志;将/usr/lib/libiomp5.dylib添加到项目的构建阶段(项目设置 - >构建阶段 - >将/usr/lib/libiomp5.dylib拖到带库的链接二进制文件中)

  9. 应该有效。 Yosemite + Xcode 6已经过测试。

  10. 注意:自定义铿锵声并不像Apple那样稳定。如果在编译后遇到奇怪的指令错误,请切换回来。