Tengo un pequeño proyecto de prueba que usa OpenMP para la paralelización. Mi objetivo es compilarlo para que produzca .dll
y .lib
para bibliotecas (porque mi proyecto real se vincula a bibliotecas externas distribuidas usando estos tipos), con soporte para OpenMP 4.5 o posterior y hacerlo desde la línea de comandos para que se pueda hacer en un acoplador para prueba y verificación (la parte del acoplador está fuera del alcance de esta pregunta, es solo una referencia de por qué necesito que funcione desde la línea de comandos). Puedo compilar este proyecto con diferentes compiladores con los que no estoy contento:
- MSVC:,
mkdir build-msvc
luegocmake ..
(desde la carpeta recién creada) y finalmentecmake --build . --config Release
. Esto compila bien pero solo es compatible con OpenMP 2.0, por lo tanto, no es una buena opción para mi proyecto real. - Intel Parallel Studio:,
mkdir build-intel
luegocmake .. -T "Intel C++ Compiler 19.0"
(desde la carpeta recién creada) y finalmentecmake --build . --config Release
. Esto es compatible con OpenMP 5.0, pero sus licencias son bastante caras para mí. - MinGW x64 g ++:,
mkdir build-g++
luegocmake .. -G "MinGW Makefiles"
(desde la carpeta recién creada) y finalmentecmake --build .
. Es compatible con OpenMP 4.5 pero este compilador no es compatible con.lib
(que yo sepa) que ya mencioné es necesario para mí.
He intentado sin éxito utilizar clang:
- CLANG desde MSVC:,
mkdir build-clang-msvc
luegocmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
(desde la carpeta recién creada), pero falla con el siguiente error:
- La identificación del compilador CXX es Clang 8.0.1 con línea de comandos similar a MSVC - Compruebe si funciona el compilador CXX: C: / Archivos de programa (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - Compruebe si funciona el compilador CXX: C: / Archivos de programa (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe - roto Error de CMake en C: / Archivos de programa / CMake / share / cmake-3.15 / Módulos / CMakeTestCXXCompiler.cmake: 53 (mensaje): El compilador de C ++ "C: / Archivos de programa (x86) / Microsoft Visual Studio / 2019 / Community / VC / Tools / Llvm / bin / clang-cl.exe" no puede compilar un programa de prueba simple. Falla con el siguiente resultado: Cambiar Dir: C: / Usuarios / [NOMBRE DE USUARIO] / source / repos / test_openmp / build-clang-msvc / CMakeFiles / CMakeTmp Ejecutar comandos de compilación: C: /PROGRA~2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe cmTC_bd131 && [1/2] Creación de objetos CXX CMakeFiles \ cmTC_bd131.dir \ testCXXCompiler.cxx.obj [2/2] Vinculación del ejecutable CXX cmTC_bd131.exe FALLIDO: cmTC_bd131.exe cmd.exe / C "cd. &&" C: \ Archivos de programa \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_bd131.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - manifiestos: 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: el comando "rc / fo CMakeFiles \ cmTC_bd131.dir / manifest.res CMakeFiles \ cmTC_bd131.dir / manifest.rc" falló (código de salida 0) con el siguiente resultado: El sistema no puede encontrar el archivo especificado ninja: compilación detenida: el subcomando falló. CMake no podrá generar correctamente este proyecto. Pila de llamadas (la llamada más reciente primero): CMakeLists.txt: 2 (proyecto) - ¡Configuración incompleta, se produjeron errores! Consulte también "C: / Usuarios / [NOMBRE DE USUARIO] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeOutput.log". Consulte también "C: / Usuarios / [NOMBRE DE USUARIO] /source/repos/test_openmp/build-clang-msvc/CMakeFiles/CMakeError.log".
- Clang y Ninja, aparte de MSVC:,
mkdir build-clang-ninja
luegocmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
(desde la carpeta recién creada y cambiando laPATH
variable de entorno para que los que no sean msvc se encuentren primero), pero falla con el siguiente error:
- La identificación del compilador CXX es Clang 9.0.0 con línea de comandos similar a MSVC - Compruebe si funciona el compilador CXX: C: / Archivos de programa / LLVM / bin / clang-cl.exe - Compruebe si funciona el compilador CXX: C: / Archivos de programa / LLVM / bin / clang-cl.exe - roto Error de CMake en C: / Archivos de programa / CMake / share / cmake-3.15 / Módulos / CMakeTestCXXCompiler.cmake: 53 (mensaje): El compilador de C ++ "C: / Archivos de programa / LLVM / bin / clang-cl.exe" no puede compilar un programa de prueba simple. Falla con el siguiente resultado: Cambiar Dir: C: / Usuarios / [NOMBRE DE USUARIO] / source / repos / test_openmp / buid-clang-ninja / CMakeFiles / CMakeTmp Ejecute los comandos de compilación: C: /Ninja/ninja.exe cmTC_50b73 && [1/2] Construyendo objetos CXX CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj [2/2] Vinculación del ejecutable CXX cmTC_50b73.exe FALLIDO: cmTC_50b73.exe cmd.exe / C "cd. &&" C: \ Archivos de programa \ CMake \ bin \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_50b73.dir --rc = rc --mt = CMAKE_MT-NOTFOUND - manifiestos: 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 / machine: x64 / debug / machine: INC64MENT / debug subsistema: consola kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ". RC Pass 1: el comando "rc / fo CMakeFiles \ cmTC_50b73.dir / manifest.res CMakeFiles \ cmTC_50b73.dir / manifest.rc" falló (código de salida 0) con el siguiente resultado: El sistema no puede encontrar el archivo especificado ninja: compilación detenida: el subcomando falló. CMake no podrá generar correctamente este proyecto. Pila de llamadas (la llamada más reciente primero): CMakeLists.txt: 2 (proyecto) - ¡Configuración incompleta, se produjeron errores! Consulte también "C: / Usuarios / [NOMBRE DE USUARIO] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeOutput.log". Consulte también "C: / Usuarios / [NOMBRE DE USUARIO] /source/repos/test_openmp/buid-clang-ninja/CMakeFiles/CMakeError.log".
¿Alguna idea sobre cómo proceder con el sonido metálico? Creo que es mi mejor opción para lo que quiero lograr (compilar mi programa de prueba con soporte para OpenMP 4.5 o posterior y producir .lib
y .dll
).
Publicaciones / páginas web relacionadas que he verificado pero que no han sido útiles para resolver esto:
- Creación de un proyecto c ++ en Windows con CMake, Clang y Ninja
- Construyendo con CMake, Ninja y Clang en Windows
- Formas de compilar con Clang en Windows , configurando específicamente el vinculador:
-DCMAKE_LINKER="C:/Program Files/LLVM/bin/lld-link.exe"
- CMake building para Windows (clang-cl) usando Ninja Generator
- Manual de usuario de Clang-cl
Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
. Investigaré este nuevo error y si no encuentro una respuesta, publicaré una nueva pregunta. ¡Gracias!Respuestas:
Pude duplicar este error para el caso Clang + MSVC . Debido a que estamos tratando de usar el compilador personalizado de Visual-Studio desde fuera de Visual Studio (es decir, la línea de comandos), es necesario inicializar el entorno de compilación VS en nuestra línea de comandos antes de usar el compilador. Los
VCVarsXX.bat
archivos logran esto; son parte de las herramientas del símbolo del sistema VS. Así que por la selección de su arquitectura (x86
,x64
, etc.) y ejecutar el script, esto debería permitir CMake para construir el programa de prueba simple conclang-cl
y proceder. Aquí es donde se encuentra para VS 2019:Para ampliar el tema de OpenMP, personalmente encontré que usar
find_package(OpenMP REQUIRED)
es bastante infructuoso. Como mencionó, también recibí este error de CMake:Hay algunas sugerencias en este sitio (por ejemplo, aquí y aquí ) que afirman que completar todas las variables manualmente permite
FindOpenMP.cmake
encontrar con éxito las bibliotecas. Intenté esto con su archivo CMake de ejemplo, con cierto éxito:Esto logró "encontrar" las bibliotecas en el segundo intento de configuración de CMake (el primero siempre produjo el mismo
Could NOT find OpenMP_CXX
error que antes):Sin embargo , esto no pudo generar el ejecutable, ya que ninguna de las variables CMake OpenMP (en particular
OpenMP_CXX_LIBRARIES
) realmente apuntan a la ubicación de la biblioteca. Las deficiencias de CMakeFindOpenMP.cmake
se han planteado en el sitio del problema de CMake aquí , y también parece haber limitaciones relevantes en el extremo LLVM / Clang.De todos modos, la forma más limpia en que pude hacer que el ejemplo funcionara fue deshacerse por
find_package()
completo. Lo siguiente me permitió generar con éxito el sistema de compilación y compilar y ejecutar el ejecutable:fuente
vcvarsall.bat
no me pone clang-cl en la RUTA. ¿Alguna idea de por qué?