WindowsでCMakeを構成し、コマンドラインからclangを使用して最新のOpenMPサポートを取得する


11

並列化にOpenMPを使用する小さなテストプロジェクトがあります。私の目標は、OpenMP 4.5以降のサポートを備えたライブラリ(これらのタイプを使用して配布された外部ライブラリへの実際のプロジェクトリンクのため)を生成.dll.libてライブラリ用にコンパイルし、コマンドラインから実行して、Dockerで実行できるようにすることですテストとチェック(Dockerの部分はこの質問の範囲外です。これは、コマンドラインから機能させる必要がある理由の参考に過ぎません)。私はこのプロジェクトを別のコンパイラーでコンパイルできますが、満足できないものがあります。

  • MSVC:、mkdir build-msvc次にcmake ..(新しく作成されたフォルダーから)、最後にcmake --build . --config Release。これは問題なくコンパイルできますが、OpenMP 2.0のみをサポートしているため、実際のプロジェクトには適していません。
  • Intel Parallel Studio:、mkdir build-intel次にcmake .. -T "Intel C++ Compiler 19.0"(新しく作成されたフォルダーから)、最後にcmake --build . --config Release。これはOpenMP 5.0をサポートしていますが、そのライセンスは私にとってかなり高価です。
  • MinGW x64 g ++:、mkdir build-g++次にcmake .. -G "MinGW Makefiles"(新しく作成されたフォルダーから)、最後にcmake --build .。これはOpenMP 4.5をサポートしていますが、このコンパイラーは.lib(私が知る限り)互換性がなく、すでに述べたように必要です。

私は成功せずにclangを使用しようとしました:

  • MSVCからのCLANG:、mkdir build-clang-msvc次にcmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(新しく作成されたフォルダーから)、次のエラーで失敗します。
-CXXコンパイラIDは、MSVCに似たコマンドラインを備えたClang 8.0.1です。
-動作するCXXコンパイラを確認します:C:/ Program Files(x86)/ Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe
-機能しているCXXコンパイラーを確認します:C:/ Program Files(x86)/ Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe-broken
C:/ Program Files / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake:53(メッセージ)でのCMakeエラー:
  C ++コンパイラ

    「C:/ Program Files(x86)/ Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe」

  簡単なテストプログラムをコンパイルすることはできません。

  次の出力で失敗します。

    ディレクトリの変更:C:/ Users / [ユーザー名] / source / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp

    ビルドコマンドを実行:C:/PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] CXXオブジェクトの作成CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj
    [2/2] CXX実行可能ファイルcmTC_bd131.exeのリンク
    失敗:cmTC_bd131.exe
    cmd.exe / C "cd。&&" C:\ Program Files \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_bd131.dir --rc = rc --mt = CMAKE_MT-NOTFOUND-マニフェスト-C:\ PROGRA〜1 \ MINGW-〜1 \ X86_64〜1.0-P \ mingw64 \ bin \ ld.exe / nologo CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj /out:cmTC_bd131.exe / implib: cmTC_bd131.lib /pdb:cmTC_bd131.pdb /version:0.0 / machine:X86 / debug / INCREMENTAL / subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32 .lib advapi32.lib && cd」
    RCパス1:コマンド "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc"は次の出力で失敗しました(終了コード0)。
    システムは、指定されたファイルを見つけることができません
    忍者:ビルドが停止しました:サブコマンドが失敗しました。





  CMakeはこのプロジェクトを正しく生成できません。
呼び出しスタック(最新の呼び出しが最初):
  CMakeLists.txt:2(プロジェクト)


-設定が不完全で、エラーが発生しました!
「C:/ Users / [ユーザー名] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log」もご覧ください。
「C:/ Users / [ユーザー名] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log」もご覧ください。
  • クランと忍者離れMSVCから:mkdir build-clang-ninja、その後、cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(新しく作成したフォルダから、変化するPATH非MSVCが最初に発見されているように、環境変数)が、それは次のエラーで失敗します。
-CXXコンパイラIDは、MSVCに似たコマンドラインを備えたClang 9.0.0です。
-動作しているCXXコンパイラを確認します:C:/ Program Files / LLVM / bin / clang-cl.exe
-動作しているCXXコンパイラを確認します:C:/ Program Files / LLVM / bin / clang-cl.exe-壊れています
C:/ Program Files / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake:53(メッセージ)でのCMakeエラー:
  C ++コンパイラ

    「C:/ Program Files / LLVM / bin / clang-cl.exe」

  簡単なテストプログラムをコンパイルすることはできません。

  次の出力で失敗します。

    ディレクトリの変更:C:/ Users / [ユーザー名] / source / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp

    ビルドコマンドを実行:C:/Ninja/ninja.exe cmTC_50b73 && [1/2] CXXオブジェクトのビルドCMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj
    [2/2] CXX実行可能ファイルcmTC_50b73.exeのリンク
    失敗しました:cmTC_50b73.exe
    cmd.exe / C "cd。&&" C:\ Program Files \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_50b73.dir --rc = rc --mt = CMAKE_MT-NOTFOUND-マニフェスト-CMAKE_LINKER-NOTFOUND / nologo CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj /out:cmTC_50b73.exe /implib:cmTC_50b73.lib /pdb:cmTC_50b73.pdb /version:0.0 / machine:x64 / debug / INCREMENTAL /サブシステム:コンソールkernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd
    RCパス1:コマンド「rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc」が次の出力で失敗しました(終了コード0)。
    システムは、指定されたファイルを見つけることができません
    忍者:ビルドが停止しました:サブコマンドが失敗しました。





  CMakeはこのプロジェクトを正しく生成できません。
呼び出しスタック(最新の呼び出しが最初):
  CMakeLists.txt:2(プロジェクト)


-設定が不完全で、エラーが発生しました!
「C:/ Users / [ユーザー名] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log」もご覧ください。
「C:/ Users / [ユーザー名] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log」もご覧ください。

clangの進め方に関するアイデアはありますか?私はそれが私が達成(OpenMPの4.5以降をサポートし、生産と私のテストプログラムをコンパイルしたいもののために私の最良の選択肢だと思う.lib.dll)。

私がチェックしたが、これを解決するために役に立たなかった関連の投稿/ウェブページ:


cmakeコマンドを発行する前に、関連するvcvarsXX.batファイルをロードしようとしましたか?
Le Ngoc Thuong

わからないのでわかりません。コマンドプロンプトを開き、ビルドフォルダーに移動して、作成したCMakeコマンドを実行するだけです。この関連ファイルをどのようにロードできますか?
アパロマー

1
MSVCでビルドするプロジェクトで作業しています。プロジェクトをビルドするときは常に、常に「%VCINSTALLDIR%\ vcvarsall.bat amd64」を最初に実行する必要があります。また、このページの答えに基づいて、stackoverflow.com / questions / 22585874 /…です。彼/彼女はまた、「関連するvcvarsXX.batファイルをロードする(たとえば、「<Visual Studioの場所> \ VC \ vcvarsall.bat」x86)」と推奨しています。vcvarsall.batの実行を忘れたときと同じエラーメッセージが表示されました
Le Ngoc Thuong

それは間違いなく私を前進させました。今、私は次のステップで立ち往生していCould NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)ます:。この新しいエラーを掘り下げて、答えが見つからない場合は、新しい質問を投稿します。ありがとうございました!
アパロマー'11年

回答:


4

Clang + MSVCのケースでこのエラーを再現できました。Visual Studioに合わせたコンパイラをVisual Studioの外部(つまり、コマンドライン)から使用しようとしているため、コンパイラを使用する前に、コマンドラインでVSビルド環境を初期化する必要がありますVCVarsXX.batファイルには、これを実現します。これらはVSコマンドプロンプトツールの一部です。だからあなたのアーキテクチャ(選ぶことによってx86x64など)、スクリプトを実行している、これはcmakeのは、と簡単なテストプログラムを構築することを可能にする必要がありますclang-clと進みます。VS 2019の場所は次のとおりです。

>"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86

>cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
-- The CXX compiler identification is Clang 8.0.1
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/bin/clang-cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/bin/clang-cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
...

OpenMPの問題を拡大するために、私はを使用find_package(OpenMP REQUIRED)することはかなり役に立たないことを個人的に知りました。あなたが言ったように、私はこのCMakeエラーも受け取りました:

Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)

このサイト(たとえばherehere)には、すべての変数を手動で入力するFindOpenMP.cmakeとライブラリを正常に見つけることができると主張するいくつかの提案があります。私はあなたのサンプルCMakeファイルでこれを試しましたが、いくつか成功しました:

cmake_minimum_required (VERSION 2.8)
project(test_openmp LANGUAGES CXX)

set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")
set(OpenMP_CXX_FLAGS "-Xclang -fopenmp")
set(OpenMP_CXX_LIB_NAMES "libomp" "libiomp5")
set(OpenMP_libomp_LIBRARY libomp)
set(OpenMP_libiomp5_LIBRARY libiomp5)

#OPENMP
find_package(OpenMP REQUIRED)
if(OPENMP_FOUND)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

# Library
add_library(example_lib SHARED example_lib.h example_lib.cpp)
target_link_libraries(example_lib PUBLIC ${OpenMP_CXX_LIBRARIES})
target_compile_definitions(example_lib PRIVATE EXEMPLE_LIB_EXPORT)

# Executable
add_executable(test_openmp test_openmp.cpp)
target_link_libraries(test_openmp example_lib)

これは、2回目のCMake構成の試行でライブラリを「見つける」ことに成功しました(最初の試行では常にCould NOT find OpenMP_CXX以前と同じエラーが発生しました)。

>cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
-- Found OpenMP_CXX: -Xclang -fopenmp (found version "3.1")
-- Found OpenMP: TRUE (found version "3.1")
-- Configuring done
-- Generating done

ただし、CMake OpenMP変数(特にOpenMP_CXX_LIBRARIES)は実際にはライブラリの場所を指していなかったため、実行可能ファイルの構築に失敗しました。CMakeの欠点はCMakeのFindOpenMP.cmake問題サイト(こちら)で提起されており、LLVM / Clangエンドにも関連する制限があるようです。


いずれにせよ、私がこの例を機能させる最もクリーンな方法は、find_package()完全に捨てることでした。以下により、ビルドシステムを正常に生成し、実行可能ファイルをコンパイルして実行することができました。

cmake_minimum_required (VERSION 2.8)
project(test_openmp LANGUAGES CXX)

set(OpenMP_LIBRARY_DIR "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/lib")
set(OpenMP_CXX_FLAGS "-Xclang -fopenmp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

# Tell CMake where to find the OpenMP libraries.
link_directories(${OpenMP_LIBRARY_DIR})

# Library
add_library(example_lib SHARED example_lib.h example_lib.cpp)
# Link in the OpenMP libraries.
target_link_libraries(example_lib PUBLIC libomp libiomp5md)
target_compile_definitions(example_lib PRIVATE EXEMPLE_LIB_EXPORT)

# Executable
add_executable(test_openmp test_openmp.cpp)
target_link_libraries(test_openmp example_lib)

CMake 3.17には、このエラーを解決するためのサポートが組み込まれています。エラーはこのコミットで修正されます。
アパロマー

@apalomerありがとう!より簡単な解決策を知っている場合は、投稿してください!
squareskittles

実行vcvarsall.batしても、clang-clはPATHに含まれません。なぜか?
アレックスReinking

@AlexReinking clang-clがインストールされていますか?セットアップと、これらのコンポーネントをどのようにインストールしたを知らずに知ることは困難です。必要に応じて、別の質問をすることをお勧めします!
squareskittles

はい、VS2019インストーラーを通じてインストールされます
Alex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.