Configura CMake in Windows per usare clang dalla riga di comando per ottenere il supporto OpenMP moderno


11

Ho un piccolo progetto di test che utilizza OpenMP per la parallelizzazione. Il mio obiettivo è quello di compilarlo in modo che produca .dlle .libper le librerie (perché il mio progetto reale si collega a librerie esterne distribuite utilizzando questi tipi), con supporto per OpenMP 4.5 o versioni successive e farlo dalla riga di comando in modo che possa essere eseguito su una finestra mobile per test e verifica (la parte della finestra mobile non rientra nell'ambito di questa domanda, è solo per riferimento sul motivo per cui ho bisogno che funzioni dalla riga di comando). Posso compilare questo progetto con diversi compilatori di cui non sono contento:

  • MSVC:, mkdir build-msvcquindi cmake ..(dalla cartella appena creata) e infine cmake --build . --config Release. Questo compila bene ma supporta solo OpenMP 2.0, quindi non è una buona opzione per il mio vero progetto.
  • Intel Parallel Studio:, mkdir build-intelquindi cmake .. -T "Intel C++ Compiler 19.0"(dalla cartella appena creata) e infine cmake --build . --config Release. Questo supporta OpenMP 5.0 ma le sue licenze sono piuttosto costose per me.
  • MinGW x64 g ++:, mkdir build-g++quindi cmake .. -G "MinGW Makefiles"(dalla cartella appena creata) e infine cmake --build .. Supporta OpenMP 4.5 ma questo compilatore non è compatibile con .lib(per quanto ne so) che ho già menzionato è necessario per me.

Ho provato senza successo a usare clang:

  • CLANG da MSVC:, mkdir build-clang-msvcquindi cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(dalla cartella appena creata), ma non riesce con il seguente errore:
- L'identificazione del compilatore CXX è Clang 8.0.1 con riga di comando simile a MSVC
- Controlla il compilatore CXX funzionante: C: / Programmi (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe
- Controlla il compilatore CXX funzionante: C: / Programmi (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - rotto
Errore CMake in C: / Programmi / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (messaggio):
  Il compilatore C ++

    "C: / Programmi (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe"

  non è in grado di compilare un semplice programma di test.

  Non riesce con il seguente output:

    Cambia Dir: C: / Users / [NOME UTENTE] / source / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp

    Esegui comando / i build: C: /PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Creazione dell'oggetto CXX CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj
    [2/2] Collegamento dell'eseguibile CXX cmTC_bd131.exe
    NON RIUSCITO: cmTC_bd131.exe
    cmd.exe / C "cd. &&" C: \ Programmi \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_bd131.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - manifests - 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 / sottosistema: 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: comando "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" non riuscito (codice di uscita 0) con il seguente output:
    Il sistema non trova il file specificato
    ninja: build arrestato: sottocomando non riuscito.





  CMake non sarà in grado di generare correttamente questo progetto.
Call Stack (prima la chiamata più recente):
  CMakeLists.txt: 2 (progetto)


- Configurazione incompleta, si sono verificati errori!
Vedi anche "C: / Users / [NOME UTENTE] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log".
Vedi anche "C: / Users / [NOME UTENTE] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log".
  • Clang e Ninja oltre a MSVC:, mkdir build-clang-ninjaquindi cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(dalla cartella appena creata e cambiando la PATHvariabile ambientale in modo che i non-msvc vengano trovati per primi), ma fallisce con il seguente errore:
- L'identificazione del compilatore CXX è Clang 9.0.0 con riga di comando simile a MSVC
- Verificare il funzionamento del compilatore CXX: C: / Programmi / LLVM / bin / clang-cl.exe
- Controlla il compilatore CXX funzionante: C: / Programmi / LLVM / bin / clang-cl.exe - rotto
Errore CMake in C: / Programmi / CMake / share / cmake-3.15 / Modules / CMakeTestCXXCompiler.cmake: 53 (messaggio):
  Il compilatore C ++

    "C: / Programmi / LLVM / bin / clang-cl.exe"

  non è in grado di compilare un semplice programma di test.

  Non riesce con il seguente output:

    Cambia Dir: C: / Users / [NOME UTENTE] / source / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp

    Esegui comando / i build: C: /Ninja/ninja.exe cmTC_50b73 && [1/2] Creazione oggetto CXX CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj
    [2/2] Collegamento dell'eseguibile CXX cmTC_50b73.exe
    NON RIUSCITO: cmTC_50b73.exe
    cmd.exe / C "cd. &&" C: \ Programmi \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_50b73.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - manifests - 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: INC64 / deb / sottosistema: 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: comando "rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc" non riuscito (codice di uscita 0) con il seguente output:
    Il sistema non trova il file specificato
    ninja: build arrestato: sottocomando non riuscito.





  CMake non sarà in grado di generare correttamente questo progetto.
Call Stack (prima la chiamata più recente):
  CMakeLists.txt: 2 (progetto)


- Configurazione incompleta, si sono verificati errori!
Vedi anche "C: / Users / [NOME UTENTE] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log".
Vedi anche "C: / Users / [NOME UTENTE] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log".

Qualche idea su come procedere con il clang? Penso che sia la mia migliore opzione per quello che voglio ottenere (compilare il mio programma di test con il supporto per OpenMP 4.5 o versioni successive e di produzione .libe .dll).

Post / pagine Web correlati che ho controllato ma non sono stati utili per risolvere questo problema:


Hai provato a caricare il file vcvarsXX.bat pertinente prima di emettere il comando cmake?
Le Ngoc Thuong,

Non ne ho idea, quindi credo di no. Ho appena aperto un prompt dei comandi, navigo nella cartella di build ed eseguo i comandi CMake che ho scritto. Come posso caricare questo file pertinente?
apalomer

1
Sto lavorando con un progetto realizzato con MSVC. Ogni volta che voglio compilare il progetto, devo sempre eseguire prima "% VCINSTALLDIR% \ vcvarsall.bat amd64". Inoltre, in base alla risposta in questa pagina stackoverflow.com/questions/22585874/… . Raccomanda inoltre di "caricare il file vcvarsXX.bat pertinente (ad es." <Posizione di Visual Studio> \ VC \ vcvarsall.bat "x86)". Ho riscontrato lo stesso messaggio di errore quando mi dimentico di eseguire vcvarsall.bat
Le Ngoc Thuong,

Questo sicuramente mi ha fatto andare avanti. Ora mi sono bloccato nel passaggio successivo: Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES). Scaverò in questo nuovo errore e se non trovo una risposta, inserirò una nuova domanda. Grazie!
apalomer

Risposte:


4

Sono stato in grado di duplicare questo errore per il caso Clang + MSVC . Poiché stiamo tentando di utilizzare il compilatore su misura di Visual-Studio dall'esterno di Visual Studio (ovvero la riga di comando), è necessario inizializzare l'ambiente di compilazione VS nella nostra riga di comando prima di utilizzare il compilatore. I VCVarsXX.batfile compiono questo; fanno parte degli strumenti del prompt dei comandi VS. Quindi, scegliendo la propria architettura ( x86, x64ecc.) Ed eseguendo lo script, ciò dovrebbe consentire a CMake di creare il semplice programma di test clang-cle procedere. Ecco dove si trova per 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
...

Per espandere il problema di OpenMP, ho trovato personalmente l'uso find_package(OpenMP REQUIRED)di essere piuttosto infruttuoso. Come hai detto, ho anche ricevuto questo errore CMake:

Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)

Ci sono alcuni suggerimenti su questo sito (ad esempio qui e qui ) che sostengono che il popolamento di tutte le variabili consenta FindOpenMP.cmakedi trovare correttamente le librerie. Ho provato questo con il tuo esempio di file CMake, con un certo successo:

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)

Questo è riuscito a "trovare" le librerie al secondo tentativo di configurazione di CMake (il primo ha sempre prodotto lo stesso Could NOT find OpenMP_CXXerrore di prima):

>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

Tuttavia , ciò non è riuscito a creare l'eseguibile, poiché nessuna delle variabili OpenMP di CMake (in particolare OpenMP_CXX_LIBRARIES) indica effettivamente la posizione della libreria. Le carenze di CMake FindOpenMP.cmakesono state sollevate sul sito di emissione di CMake qui e sembrano esserci anche limitazioni rilevanti sull'estremità di LLVM / Clang.


Indipendentemente da ciò, il modo più pulito in cui sono riuscito a far funzionare l'esempio è stato quello di abbandonare del find_package()tutto. Quanto segue mi ha permesso di generare con successo il buildsystem, compilare ed eseguire l'eseguibile:

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 incorpora il supporto per questo che risolve questo errore. Gli errori sono stati corretti in questo commit.
apalomer

@apalomer Grazie! Se conosci una soluzione più semplice, per favore pubblicane una!
squareskittles,

Correre vcvarsall.batnon mette clang-cl nel PERCORSO per me. Qualche idea sul perché?
Alex Reinking,

@AlexReinking Hai installato clang-cl? È difficile sapere senza conoscere la configurazione e come sono stati installati questi componenti. Ti incoraggio a porre un'altra domanda, se necessario!
squareskittles,

Sì, è installato tramite il programma di installazione VS2019
Alex Reinking, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.