Định cấu hình CMake trong windows để sử dụng tiếng kêu từ dòng lệnh để nhận hỗ trợ OpenMP hiện đại


11

Tôi có một dự án thử nghiệm nhỏ sử dụng OpenMP để song song hóa. Mục tiêu của tôi là biên dịch nó để nó tạo ra .dll.libcho các thư viện (vì dự án thực của tôi liên kết với các thư viện bên ngoài được phân phối bằng các loại này), với sự hỗ trợ cho OpenMP 4.5 hoặc mới hơn và thực hiện nó từ dòng lệnh để có thể thực hiện trên docker cho kiểm tra và kiểm tra (phần docker nằm ngoài phạm vi của câu hỏi này, nó chỉ để tham khảo về lý do tại sao tôi cần nó để làm việc từ dòng lệnh). Tôi có thể biên dịch dự án này với các trình biên dịch khác nhau mà tôi không hài lòng:

  • MSVC : mkdir build-msvc, sau đó cmake ..(từ thư mục mới được tạo) và cuối cùng cmake --build . --config Release. Điều này biên dịch tốt nhưng chỉ hỗ trợ OpenMP 2.0, do đó không phải là một lựa chọn tốt cho dự án thực sự của tôi.
  • Intel Parallel Studio : mkdir build-intel, sau đó cmake .. -T "Intel C++ Compiler 19.0"(từ thư mục mới được tạo) và cuối cùng cmake --build . --config Release. Điều này hỗ trợ OpenMP 5.0 nhưng giấy phép của nó khá đắt đối với tôi.
  • MinGW x64 g ++ : mkdir build-g++, sau đó cmake .. -G "MinGW Makefiles"(từ thư mục mới được tạo) và cuối cùng cmake --build .. Nó hỗ trợ OpenMP 4.5 nhưng trình biên dịch này không tương thích với wiht .lib(theo như tôi biết) mà tôi đã đề cập là cần thiết đối với tôi.

Tôi đã thử mà không thành công để sử dụng tiếng kêu:

  • CLANG từ MSVC : mkdir build-clang-msvc, sau đó cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(từ thư mục mới được tạo), nhưng không thành công với lỗi sau:
- Nhận dạng trình biên dịch CXX là Clang 8.0.1 với dòng lệnh giống MSVC
- Kiểm tra trình biên dịch CXX đang hoạt động: C: / Tệp chương trình (x86) / Microsoft Visual Studio / 2019 / Cộng đồng / VC / Công cụ / Llvm / bin / clang-cl.exe
- Kiểm tra trình biên dịch CXX đang hoạt động: C: / Tệp chương trình (x86) / Microsoft Visual Studio / 2019 / Cộng đồng / VC / Công cụ / Llvm / bin / clang-cl.exe - bị hỏng
Lỗi CMake tại C: / Tệp chương trình / CMake / share / cmake-3.15 / Mô-đun / CMakeTestCXXCompiler.cmake: 53 (tin nhắn):
  Trình biên dịch C ++

    "C: / Tệp chương trình (x86) / Microsoft Visual Studio / 2019 / Cộng đồng / VC / Công cụ / Llvm / bin / clang-cl.exe"

  không thể biên dịch một chương trình thử nghiệm đơn giản.

  Nó không thành công với đầu ra sau:

    Thay đổi Dir: C: / Users / [NAME NAME] / source / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp

    Chạy Lệnh xây dựng: C: /PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Xây dựng đối tượng CXX CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj
    [2/2] Liên kết thực thi CXX cmTC_bd131.exe
    KHÔNG CÓ: cmTC_bd131.exe
    cmd.exe / C "cd. &&" C: \ Tệp chương trình \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_bd131.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - bảng kê khai - C: \ PROGRA ~ 1 \ MINGW- ~ 1 \ X86_64 ~ 1.0-P \ mingw64 \ bin \ ld.exe / nologo CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj /out:cmTC1 cmTC_bd131.lib /pdb:cmTC_bd131.pdb /version 0.0 / machine: X86 / debug / INCREMENTAL / subsystem: console kernel32.lib user32.lib gdi32.lib wonpool.lib shell32.lib ole32.lib oleaut32.lib .lib advapi32.lib && cd. "
    RC Pass 1: lệnh "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" không thành công (mã thoát 0) với đầu ra sau:
    Hệ thống không thể tìm thấy các tập tin được chỉ định
    ninja: xây dựng dừng lại: tiểu ban thất bại.





  CMake sẽ không thể tạo chính xác dự án này.
Call Stack (cuộc gọi gần đây nhất trước):
  CMakeLists.txt: 2 (dự án)


- Cấu hình không đầy đủ, xảy ra lỗi!
Xem thêm "C: / Users / [NAME NAME] /source/repose/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log".
Xem thêm "C: / Users / [NAME NAME] /source/repose/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log".
  • Clang và Ninja ngoài MSVC : mkdir build-clang-ninja, sau đó cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(từ thư mục mới được tạo và thay đổi PATHbiến môi trường để không tìm thấy msvc trước), nhưng nó không thành công với lỗi sau:
- Nhận dạng trình biên dịch CXX là Clang 9.0.0 với dòng lệnh giống MSVC
- Kiểm tra trình biên dịch CXX đang hoạt động: C: / Tệp chương trình / LLVM / bin / clang-cl.exe
- Kiểm tra trình biên dịch CXX đang hoạt động: C: / Tệp chương trình / LLVM / bin / clang-cl.exe - bị hỏng
Lỗi CMake tại C: / Tệp chương trình / CMake / share / cmake-3.15 / Mô-đun / CMakeTestCXXCompiler.cmake: 53 (tin nhắn):
  Trình biên dịch C ++

    "C: / Tệp chương trình / LLVM / bin / clang-cl.exe"

  không thể biên dịch một chương trình thử nghiệm đơn giản.

  Nó không thành công với đầu ra sau:

    Thay đổi Dir: C: / Users / [NAME NAME] / source / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp

    Chạy Lệnh xây dựng: C: /Ninja/ninja.exe cmTC_50b73 && [1/2] Xây dựng đối tượng CXX CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj
    [2/2] Liên kết thực thi CXX cmTC_50b73.exe
    KHÔNG CÓ: cmTC_50b73.exe
    cmd.exe / C "cd. bảng kê khai - CMAKEEYER-NOTFOUND / nologo CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj /out:cmTC_50b73.exe /implib:cmTC_50b73.lib /pdb:cmTC_50b73 / rb hệ thống con: console kernel32.lib user32.lib gdi32.lib wonpool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd. "
    RC Pass 1: lệnh "rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc" không thành công (mã thoát 0) với đầu ra sau:
    Hệ thống không thể tìm thấy các tập tin được chỉ định
    ninja: xây dựng dừng lại: tiểu ban thất bại.





  CMake sẽ không thể tạo chính xác dự án này.
Call Stack (cuộc gọi gần đây nhất trước):
  CMakeLists.txt: 2 (dự án)


- Cấu hình không đầy đủ, xảy ra lỗi!
Xem thêm "C: / Users / [NAME NAME] /source/repose/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log".
Xem thêm "C: / Users / [NAME NAME] /source/repose/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log".

Bất kỳ ý tưởng về cách tiến hành với tiếng kêu? Tôi nghĩ đó là lựa chọn tốt nhất của tôi cho những gì tôi muốn đạt được (biên dịch chương trình thử nghiệm của tôi với sự hỗ trợ cho OpenMP 4.5 hoặc mới hơn và sản xuất .lib.dll).

Các bài đăng / trang web liên quan mà tôi đã kiểm tra nhưng không hữu ích để giải quyết vấn đề này:


Bạn đã thử tải tệp vcvarsXX.bat có liên quan trước khi ban hành lệnh cmake chưa?
Lê Ngọc Thượng

Tôi không có ý tưởng, vì vậy tôi đoán là không. Tôi chỉ cần mở một dấu nhắc lệnh, điều hướng đến thư mục xây dựng và thực hiện các lệnh CMake mà tôi đã viết. Làm thế nào tôi có thể tải tập tin liên quan này?
apalome

1
Tôi đang làm việc với một dự án xây dựng với MSVC. Bất cứ khi nào tôi muốn xây dựng dự án, trước tiên tôi luôn cần chạy "% VCINSTALLDIR% \ vcvarsall.bat amd64". Ngoài ra, dựa trên câu trả lời trong trang này stackoverflow.com/questions/22585874/ . Anh ấy / cô ấy cũng khuyên rằng "tải tệp vcvarsXX.bat có liên quan (ví dụ:" <Vị trí Visual Studio của bạn> \ VC \ vcvarsall.bat "x86)". Tôi đã phải đối mặt với thông báo lỗi giống như bạn khi tôi quên chạy vcvarsall.bat
Lê Ngọc Thượng

Điều đó chắc chắn đã khiến tôi tiến về phía trước. Bây giờ tôi bị kẹt ở bước tiếp theo : Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES). Tôi sẽ đào sâu vào lỗi mới này và nếu tôi không tìm thấy câu trả lời tôi sẽ đăng một câu hỏi mới. Cảm ơn bạn!
apalome

Câu trả lời:


4

Tôi đã có thể nhân đôi lỗi này cho trường hợp Clang + MSVC . Vì chúng tôi đang cố gắng sử dụng trình biên dịch phù hợp với Visual-Studio từ bên ngoài Visual Studio (tức là dòng lệnh), nên cần phải khởi tạo môi trường xây dựng VS trong dòng lệnh của chúng tôi trước khi sử dụng trình biên dịch. Các VCVarsXX.battập tin thực hiện điều này; chúng là một phần của các công cụ Nhắc lệnh của VS. Vì vậy, bằng cách chọn kiến ​​trúc của bạn ( x86, x64v.v.) và chạy tập lệnh, điều này sẽ cho phép CMake xây dựng chương trình thử nghiệm đơn giản clang-clvà tiến hành. Đây là nơi nó được đặt cho 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
...

Để mở rộng về vấn đề OpenMP, cá nhân tôi thấy việc sử dụng find_package(OpenMP REQUIRED)là không có kết quả. Như bạn đã đề cập, tôi cũng đã nhận được lỗi CMake này:

Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)

Có một vài gợi ý trên trang web này (ví dụ ở đâyở đây ) cho rằng việc điền tất cả các biến theo cách thủ công cho phép FindOpenMP.cmaketìm thành công các thư viện. Tôi đã thử điều này với tệp CMake mẫu của bạn, với một số thành công:

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)

Điều này đã thành công trong việc "tìm kiếm" các thư viện trong lần thử cấu hình CMake thứ hai (lần đầu tiên luôn mang lại Could NOT find OpenMP_CXXlỗi tương tự như trước):

>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

Tuy nhiên , điều này đã thất bại trong việc xây dựng tệp thực thi, vì không có biến CMMP OpenMP nào (đặc biệt OpenMP_CXX_LIBRARIES) thực sự trỏ đến vị trí thư viện. Những thiếu sót của CMake FindOpenMP.cmakeđã được nêu ra trên trang web về vấn đề CMake ở đây và dường như cũng có những hạn chế có liên quan đến kết thúc LLVM / Clang.


Bất kể, cách sạch nhất mà tôi có thể lấy ví dụ làm việc là bỏ find_package()hoàn toàn. Sau đây cho phép tôi tạo thành công hệ thống xây dựng, biên dịch và chạy tệp thực thi:

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 kết hợp hỗ trợ cho việc này để giải quyết lỗi này. Các lỗi được sửa trong cam kết này .
apalome

@apalome Cảm ơn! Nếu bạn biết một giải pháp đơn giản hơn, xin vui lòng gửi một!
squareskittles

Chạy vcvarsall.batkhông đưa clang-cl vào PATH cho tôi. Bất cứ ý tưởng tại sao?
Alex Reinking

@AlexReinking Bạn đã cài đặt clang-cl chưa? Thật khó để biết mà không biết thiết lập của bạn và cách bạn đã cài đặt các thành phần này. Tôi khuyến khích bạn hỏi một câu hỏi khác, nếu cần thiết!
squareskittles

Có, nó được cài đặt thông qua trình cài đặt VS2019
Alex Reinking
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.