आधुनिक OpenMP समर्थन प्राप्त करने के लिए कमांड लाइन से क्लैंग का उपयोग करने के लिए खिड़कियों में CMake कॉन्फ़िगर करें


11

मेरे पास एक छोटा परीक्षण प्रोजेक्ट है जो समानांतरकरण के लिए ओपनएमपी का उपयोग करता है। मेरा लक्ष्य इसे संकलित करना है इसलिए यह पुस्तकालयों के लिए .dllऔर उत्पादन करता है .lib(क्योंकि इन प्रकारों का उपयोग करके वितरित बाहरी पुस्तकालयों के लिए मेरी वास्तविक परियोजना लिंक), ओपनएमपी 4.5 या नए के लिए समर्थन के साथ और इसे कमांड लाइन से करते हैं ताकि यह एक डॉक पर किया जा सके परीक्षण और जाँच (docker भाग इस प्रश्न के दायरे से बाहर है, यह सिर्फ इस बात के लिए है कि मुझे कमांड लाइन से काम करने की आवश्यकता क्यों है)। मैं इस परियोजना को अलग-अलग संकलक के साथ संकलित कर सकता हूं जिसके साथ मैं खुश नहीं हूं:

  • 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 का समर्थन करता है लेकिन यह संकलक संगत wiht नहीं है .lib(जहाँ तक मुझे पता है) जो मैंने पहले ही उल्लेख किया है वह मेरे लिए आवश्यक है।

मैंने क्लैंग का उपयोग करने के लिए सफलता के बिना कोशिश की है:

  • MSVC से CLANG:, mkdir build-clang-msvcतब cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(नए बनाए गए फ़ोल्डर से), लेकिन यह निम्न त्रुटि के साथ विफल रहता है:
- CXX संकलक पहचान MSVC जैसी कमांड-लाइन के साथ Clang 8.0.1 है
- काम करने के लिए जाँच करें CXX कंपाइलर: C: / प्रोग्राम फाइल्स (x86) / Microsoft विज़ुअल स्टूडियो / 2019 / कम्युनिटी / VC / टूल्स / Llvm / bin / clang-cl.exe
- काम करने के लिए जाँच करें CXX कंपाइलर: C: / प्रोग्राम फाइल्स (x86) / Microsoft विज़ुअल स्टूडियो / 2019 / कम्युनिटी / VC / टूल्स / Llvm / bin / clang-cl.exe - टूटा
C पर सीमेक एरर: / प्रोग्राम फाइल्स / सीएमके / शेयर / cmake-3.15 / मॉड्यूल / CMakeTestCXXCompiler.cmake: 53 (संदेश):
  सी ++ संकलक

    "सी: / प्रोग्राम फाइल्स (x86) / माइक्रोसॉफ्ट विजुअल स्टूडियो / 2019 / कम्युनिटी / वीसी / टूल्स / एलएलवीएम / बिन / क्लैंग-क्ले।"

  एक साधारण परीक्षण कार्यक्रम संकलित करने में सक्षम नहीं है।

  यह निम्न आउटपुट के साथ विफल होता है:

    परिवर्तन करें: C: / उपयोगकर्ता / [USER NAME] / स्रोत / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp

    रन बिल्ड कमांड (s): C: /PROGRA~2/MICROS~1/2019/COMMUNAN1/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 निष्पादन योग्य 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 =c_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। .लिब advapi32.lib && cd। "
    आरसी पास 1: कमांड "rc / fo CMakeFiles \ cmTC_bd131.dir / surf.res CMakeFiles \ cmTC_bd131.dir / default.rc" निम्नलिखित आउटपुट के साथ विफल (कोड 0 से बाहर निकलें)।
    सिस्टम निर्दिष्ट फाइल का पता लगाने में नाकामयाब रहा
    निंजा: निर्माण बंद कर दिया: सबकुंड विफल रहा।





  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पर्यावरण वैरिएबल को बदलते हुए नॉन-मिसे पीवीसी पहले पाए जाते हैं), लेकिन यह निम्न त्रुटि के साथ विफल हो जाता है:
- CXX संकलक पहचान MSVC जैसी कमांड-लाइन के साथ क्लैग 9.0.0 है
- काम करने के लिए जाँच करें CXX कंपाइलर: C: / प्रोग्राम फाइल्स / LLVM / bin / clang-cl.exe
- काम करने के लिए जाँच करें CXX कंपाइलर: C: / प्रोग्राम फाइल्स / LLVM / bin / clang-cl.exe - तोड़ा
C पर सीमेक एरर: / प्रोग्राम फाइल्स / सीएमके / शेयर / cmake-3.15 / मॉड्यूल / CMakeTestCXXCompiler.cmake: 53 (संदेश):
  सी ++ संकलक

    "C: / प्रोग्राम फाइल्स / LLVM / bin / clang-cl.exe"

  एक साधारण परीक्षण कार्यक्रम संकलित करने में सक्षम नहीं है।

  यह निम्न आउटपुट के साथ विफल होता है:

    परिवर्तन करें: C: / उपयोगकर्ता / [USER NAME] / स्रोत / repos / test_openmp / buid-clang-Ninja / CMakeFiles / CMakeTmp

    रन बिल्ड कमांड (s): C: /Njaja/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:cmTC_50b73.pdb/vort/vort/vb= सबसिस्टम: कंसोल कर्नेल 32.लिब user32.lib gdi32.lib वाइनपूल.लिब शेल 32.लिब ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd। "
    RC पास 1: कमांड "rc / fo CMakeFiles \ cmTC_50b73.dir / surf.res CMakeFiles \ cmTC_50b73.dir / default.rc" निम्नलिखित आउटपुट के साथ विफल (बाहर निकलें कोड 0):
    सिस्टम निर्दिष्ट फाइल का पता लगाने में नाकामयाब रहा
    निंजा: निर्माण बंद कर दिया: सबकुंड विफल रहा।





  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" भी देखें।

क्लैंग के साथ आगे बढ़ने के बारे में कोई विचार? मुझे लगता है कि यह मेरे लिए सबसे अच्छा विकल्प है कि मैं क्या हासिल करना चाहता हूं (ओपनएमपी 4.5 या नए और उत्पादन .libऔर .dll) के समर्थन के साथ अपने परीक्षण कार्यक्रम को संकलित करें ।

संबंधित पोस्ट / वेबपेज जो मैंने चेक किए हैं लेकिन इसे हल करने के लिए गैर-उपयोगी हैं:


क्या आपने cmake कमांड जारी करने से पहले संबंधित vcvarsXX.bat फाइल को लोड करने की कोशिश की?
Le Ngoc Thuong

मेरे पास कोई विचार नहीं है, इसलिए मुझे लगता है कि नहीं। मैं सिर्फ कमांड प्रॉम्प्ट खोलता हूं, बिल्ड फ़ोल्डर पर नेविगेट करता हूं और मेरे द्वारा लिखे गए सीएमके कमांड को निष्पादित करता हूं। मैं इस प्रासंगिक फ़ाइल को कैसे लोड कर सकता हूं?
अपोलोमेर

1
मैं एक ऐसी परियोजना के साथ काम कर रहा हूं जो MSVC के साथ बनती है। जब भी मैं परियोजना का निर्माण करना चाहता हूं, मुझे हमेशा "% VCINSTALLDIR% \ vcvarsall.bat amd64" पहले चलाना होगा। इसके अलावा, इस पृष्ठ में उत्तर के आधार पर stackoverflow.com/questions/22585874/… । वह / वह यह भी अनुशंसा करता है कि "प्रासंगिक vcvarsXX.bat फ़ाइल लोड करें (उदाहरण के लिए" <आपका विज़ुअल स्टूडियो स्थान> \ VC \ vcvarsall.bat "x86)"। जब आप vcvarsall.bat
Le Ngoc Thuong

वह निश्चित रूप से मुझे आगे बढ़ा रहा है। अब मैं अगले कदम पर अटक गया हूं Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES):। मैं इस नई त्रुटि में खुदाई करूँगा और यदि मुझे कोई उत्तर नहीं मिला तो मैं एक नया प्रश्न पोस्ट करूँगा। धन्यवाद!
अपोलोमेर ऑक्ट

जवाबों:


4

मैं क्लैंग + MSVC मामले के लिए इस त्रुटि को डुप्लिकेट करने में सक्षम था । क्योंकि हम Visual Studio (यानी कमांड लाइन) के बाहर से विजुअल-स्टूडियो-सुसंगत कंपाइलर का उपयोग करने का प्रयास कर रहे हैं , कंपाइलर का उपयोग करने से पहले हमारी कमांड लाइन में VS बिल्ड वातावरण को इनिशियलाइज़ करना आवश्यक है । VCVarsXX.batफ़ाइलों यह पूरा; वे VS कमांड प्रॉम्प्ट टूल्स का हिस्सा हैं। तो अपने आर्किटेक्चर (चुनकर x86, x64, आदि) और स्क्रिप्ट चलाने, इस CMake के साथ साधारण परीक्षण कार्यक्रम बनाने के लिए अनुमति चाहिए clang-clऔर आगे बढ़ें। यह वह जगह है जहां यह वीएस 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
...

ओपनएमपी मुद्दे पर विस्तार करने के लिए, मैं व्यक्तिगत find_package(OpenMP REQUIRED)रूप से सुंदर फलहीन होने का उपयोग कर पाया । जैसा कि आपने उल्लेख किया है, मुझे यह सीएमके त्रुटि भी मिली:

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) वास्तव में लाइब्रेरी स्थान की ओर इशारा नहीं करता है। सीएमके की कमियों को यहांFindOpenMP.cmake सीएमके मुद्दे स्थल पर उठाया गया है , और एलएलवीएम / क्लैंग अंत पर भी प्रासंगिक सीमाएं दिखाई देती हैं।


बावजूद, मैं जिस साफ-सुथरे तरीके से काम कर रहा था उसका उदाहरण मुझे 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 धन्यवाद! यदि आप अधिक सरल उपाय जानते हैं, तो कृपया एक पोस्ट करें!
23

रनिंग vcvarsall.batमेरे लिए पेट में क्लैंग-क्ल नहीं डालता है। कोई विचार क्यों?
एलेक्स रिंकिंग

@AlexReinking क्या आपके पास क्लैंग-सीएल स्थापित है? आपके सेटअप को जाने बिना और आपने इन घटकों को कैसे स्थापित किया, यह जानना मुश्किल है । यदि आवश्यक हो तो मैं आपको एक और सवाल पूछने के लिए प्रोत्साहित करता हूं!
स्क्वायर

हां, यह VS2019 इंस्टॉलर के माध्यम से स्थापित किया गया है
एलेक्स रिंकिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.