【问题标题】:Error enabling openmp - "ld: library not found for -lgomp" and Clang errors启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误
【发布时间】: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

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


【解决方案1】:

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

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

  2. 解压并编译

     mkdir build && cd build && cmake .. && make && sudo make install 
    
  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/ 上的说明从 Git 获取 openmp/clang

  5. 编译 openmp/clang

     cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j
     sudo make install
    
  6. 通常它会将 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 * ../../
    
  7. 在 Xcode 中创建一个项目,使用 clang-openmp 网站上的 Hello World 代码进行测试。创建后,在项目设置中的Custom Compiler Flags -> Other C Flags中添加“-fopenmp”;将/usr/lib/libiomp5.dylib 添加到项目的构建阶段(项目设置-> 构建阶段-> 将/usr/lib/libiomp5.dylib 拖入Link Binary with Libraries)

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

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

【讨论】:

    【解决方案2】:

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

    brew install clang-omp
    

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

    【讨论】:

    • 我收到Error: No available formula with the name "clang-omp"
    • 我遇到了同样的问题,无法通过自制软件安装clang-omp,但后来我从stackoverflow.com/questions/38971394/…找到了解决方案。它帮助我成功安装了 clang-omp。
    • 需要安装配置llvm才能使用。 clang-omp 已被合并到那里。详情请见stackoverflow.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 或使用任何可用的软件包管理系统,如MacPortsHomebrew

    【讨论】:

    • 我使用 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 库在哪里
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多