我正试图让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编译,有什么建议吗?
最新Xcode套件中的gcc
命令不再是LLVM的GCC前端(基于非常旧的GCC 4.2.1),而是指向clang
的符号链接。Clang(还)不支持OpenMP。您必须单独安装GCC的另一个版本,例如,按照本教程或使用任何可用的软件包管理系统,如MacPorts和Homebrew。
我最近刚刚解决了这个问题,并根据官方说明编写了使一切正常工作的过程。
为了便于维护,脚本会将所有内容下载到~/代码中,并将正确的环境变量附加到~/.profile文件中。对于高级用户,选择一个您想要安装lib、bin和include的好位置,然后手动移动它们。该脚本取决于从英特尔了解最新的OpenMP运行时,该运行时可以在脚本顶部进行更改。
除了一个小问题外,这个剧本应该可以在普通小牛队的情况下开箱即用。在OpenML运行时make脚本中,当指定clang时,它不会可靠地接受clang,而是继续使用默认的GCC。因此,如果您没有安装GCC(这在开箱即用的小牛队中是不正常的),它将无法构建。要解决此问题,必须根据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"
如果你正在运行自制程序,你可以通过调用来解决这个问题
brew install clang-omp
编译器将以clang-omp++
名称提供
刚刚解决了这个问题。以下是答案以及如何使用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/
-
按照上的说明从Git中抓取openmp/clanghttp://clang-omp.github.io/
-
编译openmp/clang
cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j sudo make install
-
通常它会将clang/crang++安装到/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代码进行测试。创建后,添加"-fopenmp";到自定义编译器标志->项目设置中的其他C标志;将
/usr/lib/libiomp5.dylib
添加到项目的构建阶段(项目设置->构建阶段->将/usr/lib/libiomp5.dylib
拖动到链接二进制库中) -
它应该起作用。Yosemite+Xcode 6经过测试。
注意:自定义clang不如苹果的稳定。如果编译后遇到奇怪的指令错误,请切换回来