[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).

내가 확인했지만 이것을 해결하는 데 유용하지 않은 관련 게시물 / 웹 페이지 :



답변

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)


답변