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をコンパイルする方法に関する提案はありますか?
私は最近この問題を攻撃し、 公式の指示 に基づいてすべてを機能させるプロセスのスクリプトを作成しました。
スクリプトは、メンテナンスを容易にするためにすべてを〜/ 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"
この問題を解決しました。答えに加えて、Xcodeで動作させる方法を示します。
https://www.openmprtl.org/download から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/
http://clang-omp.github.io/ の指示に従ってGitからopenmp/clangを取得します。
openmp/clangをコンパイルします
cd llvm && mkdir build && cd build && ../configure --enable-optimized && make -j
Sudo make install
通常、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 * ../../
テスト用にclang-openmp WebサイトのHello Worldコードを使用して、Xcodeでプロジェクトを作成します。作成後、プロジェクト設定で「-fopenmp」をカスタムコンパイラフラグ->その他のCフラグに追加します。プロジェクトのビルドフェーズに/usr/lib/libiomp5.dylib
を追加します(プロジェクト設定->ビルドフェーズ-> /usr/lib/libiomp5.dylib
をライブラリとリンクバイナリにドラッグ)
動作するはずです。 Yosemite + Xcode 6がテストされています。
注:カスタムclangはAppleほど安定していません。コンパイル後に奇妙な命令エラーが発生した場合、元に戻します。