[c++] 최신 OpenMP 지원을 얻기 위해 명령 줄에서 clang을 사용하도록 창에서 CMake 구성
병렬화에 OpenMP를 사용 하는 작은 테스트 프로젝트 가 있습니다. 내 목표는 생산 있도록 컴파일하는 것입니다 .dll
및 .lib
이에 대한 고정 표시기에서 수행 할 수 있도록 (외부 라이브러리 내 실제 프로젝트 링크가이 유형을 사용하여 분산하기 때문에)의 OpenMP 4.5 이상을 지원, 라이브러리 및 명령 줄에서 그것을 할 테스트 및 검사 (도커 부분은이 질문의 범위를 벗어났습니다. 명령 줄에서 작업 해야하는 이유에 대한 참조 일뿐입니다). 이 프로젝트를 내가 좋아하지 않는 다른 컴파일러로 컴파일 할 수 있습니다.
- MSVC :
mkdir build-msvc
,cmake ..
(새로 만든 폴더에서) 그리고 마지막으로cmake --build . --config Release
. 이것은 잘 컴파일되지만 OpenMP 2.0 만 지원하므로 실제 프로젝트에는 적합하지 않습니다. - : 인텔 패러렐 스튜디오
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 컴파일러 식별은 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-깨진 C : / Program Files / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake : 53에서 CMake 오류 (메시지) : C ++ 컴파일러 "C : / 프로그램 파일 (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe" 간단한 테스트 프로그램을 컴파일 할 수 없습니다. 다음 출력으로 실패합니다. Dir 변경 : C : / Users / [USER NAME] / 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 실행 파일 cmcm_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 Pass 1 : 다음 출력으로 "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc"명령이 실패했습니다 (종료 코드 0). 시스템이 지정된 파일을 찾을 수 없습니다 ninja : 빌드 중지 : 하위 명령이 실패했습니다. CMake는이 프로젝트를 올바르게 생성 할 수 없습니다. 호출 스택 (가장 최근 호출) : CMakeLists.txt : 2 (프로젝트) -불완전한 구성 오류가 발생했습니다! "C : / Users / [USER NAME] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log"도 참조하십시오. "C : / Users / [USER NAME] /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 컴파일러 식별은 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" 간단한 테스트 프로그램을 컴파일 할 수 없습니다. 다음 출력으로 실패합니다. Dir 변경 : C : / Users / [USER NAME] / 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 실행 파일 cmcm_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 하위 시스템 : console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd. " RC Pass 1 : 다음 출력으로 "rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc"명령이 실패했습니다 (종료 코드 0). 시스템이 지정된 파일을 찾을 수 없습니다 ninja : 빌드 중지 : 하위 명령이 실패했습니다. CMake는이 프로젝트를 올바르게 생성 할 수 없습니다. 호출 스택 (가장 최근 호출) : CMakeLists.txt : 2 (프로젝트) -불완전한 구성 오류가 발생했습니다! "C : / Users / [USER NAME] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log"도 참조하십시오. "C : / Users / [USER NAME] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log"도 참조하십시오.
클랜을 진행하는 방법에 대한 아이디어가 있습니까? 나는 내가 달성 (OpenMP를 4.5 이상을 지원하고 생산하는 내 테스트 프로그램을 컴파일하고 싶은 나의 최선의 선택이라고 생각 .lib
하고 .dll
).
내가 확인했지만 이것을 해결하는 데 유용하지 않은 관련 게시물 / 웹 페이지 :
- CMake, Clang 및 Ninja를 사용하여 Windows에서 C ++ 프로젝트 빌드
- Windows에서 CMake, Ninja 및 Clang으로 빌드
- Windows 에서 Clang으로 컴파일하는 방법 , 특히 링커를 설정하는 방법 :
-DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe"
- Ninja Generator를 사용하여 Windows 용 CMake 빌드 (clang-cl)
- Clang-cl 사용자 설명서
답변
Clang + MSVC 사례에 대해이 오류를 복제 할 수있었습니다 . Visual Studio 외부 (예 : 명령 줄)에서 Visual-Studio 맞춤형 컴파일러를 사용하려고하므로 컴파일러를 사용하기 전에 명령 줄에서 VS 빌드 환경 을 초기화 해야합니다 . VCVarsXX.bat
파일이 작업을 수행; 이들은 VS 명령 프롬프트 도구의 일부입니다. 따라서 아키텍처 ( x86
, x64
등)를 선택하고 스크립트를 실행하면 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)
이 사이트 (예 : 여기 및 여기 )에 모든 변수를 수동으로 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)
이것은 두 번째 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의 단점은 여기FindOpenMP.cmake
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)