กำหนดค่า CMake ใน windows เพื่อใช้เสียงดังกราวจากบรรทัดคำสั่งเพื่อรับการสนับสนุน OpenMP ที่ทันสมัย


11

ฉันมีโครงการทดสอบขนาดเล็กที่ใช้ OpenMP สำหรับการขนาน เป้าหมายของฉันคือการรวบรวมมันเพื่อผลิต.dllและ.libสำหรับห้องสมุด (เพราะโครงการจริงของฉันเชื่อมโยงไปยังห้องสมุดภายนอกที่กระจายโดยใช้ประเภทเหล่านี้) ด้วยการสนับสนุน OpenMP 4.5 หรือใหม่กว่าและทำจากบรรทัดคำสั่งเพื่อให้สามารถทำได้บนนักเทียบท่าสำหรับ การทดสอบและตรวจสอบ (ส่วนนักเทียบท่าอยู่นอกขอบเขตของคำถามนี้มันเป็นเพียงสำหรับการอ้างอิงในสาเหตุที่ฉันต้องการให้มันทำงานจากบรรทัดคำสั่ง) ฉันสามารถรวบรวมโครงการนี้ด้วยคอมไพเลอร์ต่าง ๆ ที่ฉันไม่มีความสุข:

  • 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 x 64 กรัม ++: mkdir build-g++แล้วcmake .. -G "MinGW Makefiles"(จากโฟลเดอร์ที่สร้างขึ้นใหม่) cmake --build .และในที่สุด รองรับ OpenMP 4.5 แต่คอมไพเลอร์ตัวนี้ไม่สามารถใช้ร่วมกันได้.lib(เท่าที่ฉันรู้) ซึ่งฉันได้กล่าวไปแล้วเป็นสิ่งจำเป็นสำหรับฉัน

ฉันได้ลองใช้ clang ไม่สำเร็จ:

  • CLANG จาก MSVC: mkdir build-clang-msvcจากนั้นcmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(จากโฟลเดอร์ที่สร้างขึ้นใหม่) แต่ล้มเหลวด้วยข้อผิดพลาดต่อไปนี้:
- รหัสคอมไพเลอร์ CXX คือ Clang 8.0.1 พร้อมกับบรรทัดคำสั่งเหมือน MSVC
- ตรวจสอบคอมไพเลอร์ CXX ที่ใช้งานได้: C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Community / VC / เครื่องมือ / Llvm / bin / clang-cl.exe
- ตรวจสอบคอมไพเลอร์ CXX ที่ใช้งานได้: C: / Program Files (x86) / Microsoft Visual Studio / 2019 / Community / VC / เครื่องมือ / Llvm / bin / clang-cl.exe - เสียหาย
ข้อผิดพลาดของ CMake ที่ C: / ไฟล์โปรแกรม / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (ข้อความ):
  คอมไพเลอร์ C ++

    "C: / ไฟล์โปรแกรม (x86) / Microsoft Visual Studio / 2019 / ชุมชน / VC / เครื่องมือ / Llvm / bin / clang-cl.exe"

  ไม่สามารถคอมไพล์โปรแกรมทดสอบอย่างง่ายได้

  มันล้มเหลวด้วยผลลัพธ์ต่อไปนี้:

    เปลี่ยน Dir: C: / Users / [USER NAME] / source / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp

    รันคำสั่ง Build การสร้างวัตถุ 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 /versionOUT.0 / machine: X86 / debug / INCREMENTAL / ระบบย่อย: คอนโซล kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib ole3232l .lib advapi32.lib && cd. "
    RC Pass 1: คำสั่ง "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" ล้มเหลว (รหัสทางออก 0) ด้วยเอาต์พุตต่อไปนี้:
    ระบบไม่พบแฟ้มที่ระบุ
    ninja: บิลด์หยุดทำงาน: คำสั่งย่อยล้มเหลว





  CMake จะไม่สามารถสร้างโครงการนี้ได้อย่างถูกต้อง
Call Stack (โทรล่าสุดก่อน):
  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 คือ Clang 9.0.0 พร้อมบรรทัดคำสั่งเหมือน MSVC
- ตรวจสอบคอมไพเลอร์ CXX ที่ใช้งานได้: C: / Program Files / LLVM / bin / clang-cl.exe
- ตรวจสอบคอมไพเลอร์ CXX ที่ใช้งานได้: C: / Program Files / LLVM / bin / clang-cl.exe - เสีย
ข้อผิดพลาดของ CMake ที่ C: / ไฟล์โปรแกรม / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (ข้อความ):
  คอมไพเลอร์ C ++

    "C: / ไฟล์โปรแกรม / LLVM / bin / clang-cl.exe"

  ไม่สามารถคอมไพล์โปรแกรมทดสอบอย่างง่ายได้

  มันล้มเหลวด้วยผลลัพธ์ต่อไปนี้:

    เปลี่ยน Dir: C: / Users / [ชื่อผู้ใช้] / แหล่งที่มา / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp

    เรียกใช้คำสั่ง Build: 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:cmb73.pdb ระบบย่อย: 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 จะไม่สามารถสร้างโครงการนี้ได้อย่างถูกต้อง
Call Stack (โทรล่าสุดก่อน):
  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)

โพสต์ / เว็บเพจที่เกี่ยวข้องที่ฉันได้ตรวจสอบแล้ว แต่ไม่ได้มีประโยชน์ในการแก้ปัญหานี้:


คุณพยายามโหลดไฟล์ vcvarsXX.bat ที่เกี่ยวข้องก่อนออกคำสั่ง cmake หรือไม่
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-tailored จากภายนอก 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()โดยสิ้นเชิง ต่อไปนี้จะอนุญาตให้ฉันประสบความสำเร็จในการสร้าง buildsystem และรวบรวมและทำงานปฏิบัติการ:

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 ในเส้นทางสำหรับฉัน มีความคิดอะไรไหม
อเล็กซ์ Reinking

@AlexReinking คุณติดตั้งเสียงดังกราวด์หรือไม่ เป็นการยากที่จะทราบโดยไม่ทราบว่าการตั้งค่าของคุณและวิธีการติดตั้งส่วนประกอบเหล่านี้ ฉันขอแนะนำให้คุณถามคำถามอื่นหากจำเป็น!
squareskittles

ใช่มันถูกติดตั้งผ่านตัวติดตั้ง VS2019
Alex Reinking
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.