최신 OpenMP 지원을 얻기 위해 명령 줄에서 clang을 사용하도록 창에서 CMake 구성


11

병렬화에 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 명령을 실행하기 전에 관련 vcvarsXX.bat 파일을로드하려고 했습니까?
Le Ngoc Thuong

나는 전혀 모른다. 그래서 나는 추측하지 않는다. 명령 프롬프트를 열고 빌드 폴더로 이동하여 작성한 CMake 명령을 실행합니다. 이 관련 파일을 어떻게로드 할 수 있습니까?
apalomer

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)있습니다. 이 새로운 오류를 파헤 치고 답을 찾지 못하면 새로운 질문을 게시 할 것입니다. 감사합니다!
apalomer

답변:


4

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)

CMake 3.17은이 오류를 해결하는 기능을 지원합니다. 커밋 에서 오류가 수정되었습니다 .
apalomer

@apalomer 감사합니다! 더 간단한 해결책을 알고 있다면 게시하십시오!
squareskittles

달리는 vcvarsall.bat것이 clang-cl을 PATH에 넣지 않습니다. 왜 그런지 알아?
Alex Reinking

@AlexReinking clang-cl이 설치되어 있습니까? 설정 및 이러한 구성 요소를 설치 한 방법 을 모르면 알기가 어렵습니다 . 필요한 경우 다른 질문을하는 것이 좋습니다.
squareskittles

예, VS2019 설치 프로그램을 통해 설치됩니다
Alex Reinking
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.