web-dev-qa-db-ja.com

openmpの有効化エラー-「ld:ライブラリが-lgompで見つかりません」およびClangエラー

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をコンパイルする方法に関する提案はありますか?

28
Davy Li

最新のXcodeスイートのgccコマンドは、LLVMのGCCフロントエンドではなく(非常に古いGCC 4.2.1に基づいています)、むしろclangへのシンボリックリンクです。 ClangはOpenMPを(まだ)サポートしていません。 GCCの別のバージョンを個別にインストールする必要があります。 このチュートリアル に従うか、 MacPortsHomebrew などの利用可能なソフトウェアパッケージ管理システムを使用します。

27
Hristo Iliev

私は最近この問題を攻撃し、 公式の指示 に基づいてすべてを機能させるプロセスのスクリプトを作成しました。

スクリプトは、メンテナンスを容易にするためにすべてを〜/ codeにダウンロードし、正しい環境変数を〜/ .profileファイルに追加します。上級ユーザーの場合は、lib、bin、includeをインストールしたい場所を選択し、手動で移動します。このスクリプトは、Intelの最新のOpenMPランタイムを知っている必要があります。これは、スクリプトの上部で変更できます。

1つの小さな問題を除いて、Vanilla Mavericksを使用すれば、スクリプトはそのまま使用できます。 OpenMLランタイムのmakeスクリプトでは、指定時にclangを確実に受け入れず、デフォルトのGCCで続行します。そのため、GCCがインストールされていない場合(Mavericksの標準では正常ではありません)、ビルドに失敗します。これを修正するには、OpenMPのlibomp_20131209_oss.tgzビルドに基づいて(スクリプトに記載されているように)2行をコメント化する必要があります。 OpenMLの新しいビルドはこのスクリプトを破壊する可能性があるため、新しいバージョンでは自分の責任で使用してください。

このスクリプトをファイルに保存し、「chmod + x filename.sh」を実行し、ターミナルから「./filename.sh」を実行します。 LLVMとClangを構築するにはしばらく時間がかかりますので、しばらくお待ちください。

編集:このスクリプトはYosemiteで失敗する可能性が高く、OSX 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"
13
Jason Parham

homebrew を実行している場合、以下を呼び出すことでこの問題を修正できます。

brew install clang-omp

コンパイラはclang-omp++名前

5
Anvaka

この問題を解決しました。答えに加えて、Xcodeで動作させる方法を示します。

  1. https://www.openmprtl.org/download からopenMPランタイムライブラリの最新バージョンを入手します。

  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/ の指示に従って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. テスト用にclang-openmp WebサイトのHello Worldコードを使用して、Xcodeでプロジェクトを作成します。作成後、プロジェクト設定で「-fopenmp」をカスタムコンパイラフラグ->その他のCフラグに追加します。プロジェクトのビルドフェーズに/usr/lib/libiomp5.dylibを追加します(プロジェクト設定->ビルドフェーズ-> /usr/lib/libiomp5.dylibをライブラリとリンクバイナリにドラッグ)

  8. 動作するはずです。 Yosemite + Xcode 6がテストされています。

注:カスタムclangはAppleほど安定していません。コンパイル後に奇妙な命令エラーが発生した場合、元に戻します。

3
Raymond