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

33

我试图在Mavericks上让我的程序运行openmp,但是当我尝试使用标志-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 吗? - keltar
是的,我很确定:
$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
- Davy Li
版本格式类似于clang使用的格式,并且提到了LLVM和clang;也许dragonegg的行为方式是这样的,但我怀疑(从未见过-抱歉)。不幸的是,我没有在osx上的经验,只能说一个简单的事实,即clang尚未与openmp一起工作-它的参与似乎是您问题的根源。无论如何,如果“--version”没有说明它是FSF的gcc-那么我认为它不是。 - keltar
1
对于支持OpenMP的编译器,以下是一个3秒钟的教程:如何编译和运行OpenMP程序 - jww
4个回答

27

最新的 Xcode 套件中 gcc 命令不再是基于非常老的 GCC 4.2.1 的 LLVM 的 GCC 前端,而是一个指向 clang 的符号链接。Clang 目前还不支持 OpenMP。你需要单独安装另一个版本的 GCC,例如按照这个教程进行操作,或使用任何现有的软件包管理系统,如MacPortsHomebrew


2
我已经使用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?
- Davy Li
1
Homebrew会在/usr/local目录下安装软件。请确保/usr/local/bin已经被添加到了$PATH环境变量中,并且它在/usr/bin之前。此外,从Homebrew安装的GCC二进制文件可能会带有版本后缀,例如gcc-4.9而不是简单的gcc - Hristo Iliev
2
“Clang是否仍然不支持OpenMP?”这个问题是真的吗?请参考:http://clang-omp.github.io 如果我安装它,你认为会影响Xcode 5吗? - RawMean
@RawMean,你在构建和运行OpenMP/Clang方面有成功吗? - Hristo Iliev
是的,我已经编译和构建了它。但是我仍然无法告诉Qt库在哪里。 - RawMean

13

我最近解决了这个问题,并根据官方说明编写了获取所有工作内容的脚本。

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

该脚本应该可以直接在普通Mavericks上使用,除了一个小问题。在OpenML运行时创建脚本时,它不可靠地接受指定的clang并继续默认的GCC。因此,如果您没有安装GCC(这在开箱即用的Mavericks上不是正常情况),它将无法构建。为了解决此问题,您必须注释掉两行代码(如脚本中所示),基于OpenMP的libomp_20131209_oss.tgz版本。更新的OpenML版本可能会破坏此脚本,因此在较新的版本上使用需自担风险。

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

编辑:这个脚本在Yosemite上很可能会失败,我在将操作系统更新到10.10的dev版本后使用内置的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文件,导出目录有很多文件夹,但没有文件。 - Kenny D.
可能是将libiomp5.dylib放在另一个文件夹中。我不确定为什么../exports/中存在所有不同的文件夹,但我建议尝试查看与mac_32e平行的其他文件夹以寻找库文件。 - Jason Parham
@JasonParham 非常棒的答案。谢谢!我遇到了一些问题,正在构建OpenMP,因为未识别的链接器选项现在被视为硬错误(clang:error:unknown argument: '-no-intel-extensions' [-Wunused-command-line-argument-hard-error-in-future] clang:note:此将成为将来的硬错误(无法降级为警告))。我的hack是注释掉“src/makefile.mk”的433行。这将去除未识别的选项。 - Randi
1
@JasonParham 我按照指示成功安装了clang。但是很遗憾,我无法编译简单的hello world程序。我收到了以下错误信息: $ clang2++ hello.cpp hello.cpp:1:10: fatal error: 'iostream'文件未找到 你能告诉我如何解决这个问题吗? - Kris
1
每当我使用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++") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lstdc++ -stdlib=libstdc++") - Jason Parham
显示剩余8条评论

4

如果你正在使用homebrew,你可以通过执行以下命令来解决此问题:

brew install clang-omp

编译器将以 clang-omp++ 的名称提供。

4
出错了:没有名为"clang-omp"的可用公式。 - dispatchswift
我遇到了同样的问题,无法通过Homebrew安装clang-omp,但后来我从https://dev59.com/KVkT5IYBdhLWcg3wK8hT找到了解决方案。它帮助我成功安装了clang-omp。 - pitfall
1
您需要安装和配置LLVM才能使用。clang-omp已经合并在其中。有关详细信息,请参见https://dev59.com/KVkT5IYBdhLWcg3wK8hT#39843038。 - elec3647

3

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

  1. Grab the latest version of openMP runtime library from https://www.openmprtl.org/download

  2. unzip and compile it by

     mkdir build && cd build && cmake .. && make && sudo make install 
    
  3. install it by

     sudo cp ./libiomp5.dylib /usr/lib/
     sudo cp ./omp.h /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/
    
  4. Grab openmp/clang from Git following the instructions on http://clang-omp.github.io/

  5. compile openmp/clang

     cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j
     sudo make install
    
  6. normally it would install clang/clang++ into /usr/local/bin, we need replace the Apple clang with our version

     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 * ../../
    
  7. Create a project in Xcode, using the Hello World code on clang-openmp website for test. After created, add "-fopenmp" to Custom Compiler Flags -> Other C Flags in project settings; add /usr/lib/libiomp5.dylib to the build phases of project (project settings -> Build Phases -> Drag /usr/lib/libiomp5.dylib into Link Binary with Libraries)

  8. It should work. Yosemite + Xcode 6 is tested.

注意:自定义的clang不如苹果公司的稳定。如果编译后出现奇怪的指令错误,请切换回原先的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接