C++ 启用openmp时出错-“;ld:找不到-lgomp“的库;和叮当作响的错误

C++ 启用openmp时出错-“;ld:找不到-lgomp“的库;和叮当作响的错误,c++,gcc,clang,openmp,osx-mavericks,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时,我会收到非常奇怪的

我试图让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时,我会收到非常奇怪的叮当声警告。并且查看/usr/bin/gcc,它似乎并没有链接到Clang


关于如何修复我的Clang错误并让openmp编译,有什么建议吗?

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

我最近刚刚解决了这个问题,并已编写了脚本,说明了如何根据该版本使所有内容正常工作

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

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

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

EDIT:这个脚本很可能在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"

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

  • 从中获取最新版本的openMP运行时库

  • 解压并编译它

    mkdir build && cd build && cmake ..
    
  • 通过以下方式安装它:

    sudo cp ./libiomp5.dylib /usr/lib/
    sudo cp ./omp.h /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/
    
  • 按照上的说明从Git获取openmp/clang

  • 编译openmp/clang

    cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j
    sudo make install
    
  • 通常它会将clang/clang++安装到/usr/local/bin中,我们需要用我们的版本替换苹果的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代码进行测试。创建后,在项目设置中的自定义编译器标志->其他C标志中添加“-fopenmp”;将
    /usr/lib/libiomp5.dylib
    添加到项目的构建阶段(项目设置->构建阶段->将
    /usr/lib/libiomp5.dylib
    拖动到与库的链接二进制文件中)

  • 它应该会起作用。约塞米蒂+Xcode 6已经过测试

  • 注意:定制的叮当声不如苹果的稳定。如果编译后遇到奇怪的指令错误,请切换回。

    如果正在运行,可以通过调用:

    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
    

    编译器将在
    clangomp++
    name

    下可用。您确定它是
    gcc
    ?你能检查一下gcc--version吗?是的,我很确定:$gcc--version配置了--prefix=/Applications/Xcode.app/Contents/Developer/usr--gxx-include dir=/usr/include/c++/4.2.1苹果LLVM版本5.0(clang-500.2.79)(基于LLVM 3.3svn)目标:x86_64-apple-darwin13.0.0线程模型:posix`版本格式类似于clang使用的版本格式,其中提到了LLVM和clang;也许龙蛋的行为就是这样,但我对此表示怀疑(从未见过——对不起)。不幸的是,我没有osx方面的经验,我只想说一个简单的事实,即clang还不能与openmp一起工作——它的参与似乎是您问题的根源。无论如何,如果
    --version
    没有说它是FSF的gcc,那么我认为它与此无关。对于支持OpenMP的编译器,这里有一个3秒钟的教程:。我使用brew安装gcc49[
    brew安装gcc49
    ],但似乎gcc仍与Clang相关联<代码>$g++--配置为--prefix=/Applications/Xcode.app/Contents/Developer/usr--配置为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我是否必须手动设置gcc的符号链接以使用gcc 4.9而不是clang?自制软件在
    /usr/local
    中安装。确保
    /usr/local/bin
    位于
    $PATH
    中,并且位于
    /usr/bin
    之前。此外,可能是来自自制的GCC二进制文件的后缀是版本,例如,
    GCC-4.9
    ,而不是简单的
    GCC
    。是否仍然存在“Clang不支持OpenMP”的情况。看看这个:如果我安装这个,你认为它会破坏Xcode 5吗?@RawMean,你有没有成功构建和运行OpenMP/Clang?是的,编译并构建了它。但是我仍然无法告诉Qt库在哪里Hi,尝试使用此脚本,但我找不到此文件:~/code/libomp\u oss/exports/mac\u 32e/lib.thin我检查过,它确实丢失了,事实上,我手动下载了tgz,导出目录有很多文件夹,但没有文件。它可能会将libiomp5.dylib放在另一个文件夹中。我不太清楚为什么在../exports/中存在所有不同的文件夹,但我会尝试在与mac_32e平行的其他文件夹中查找库。在osx mavericks中,我发现上面的脚本有以下错误。@JasonParham我按照指示进行了操作