Pregunta sobre cross-compiling, c, cmake – ¿Puedo omitir las pruebas del compilador de cmake o evitar "error: opción no reconocida '-rdynamic'"

26

Opciones de compilación para cmake (en Windows) para el sistema de destino ARM, pero cuando ejecuto configure, se están iniciando las pruebas del compilador:

CMake Error at D:/Program Files/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
  The C compiler "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe" is not
  able to compile a simple test program.

  It fails with the following output:

   Change Dir: D:/merge/complex/build/CMakeFiles/CMakeTmp



  Run Build Command:D:/PROGRA~1/YAGART~1/bin/make.exe "cmTryCompileExec/fast"

  D:/PROGRA~1/YAGART~1/bin/make.exe -f
  CMakeFiles/cmTryCompileExec.dir/build.make
  CMakeFiles/cmTryCompileExec.dir/build

  make.exe[1]: Entering directory
  `D:/merge/complex/build/CMakeFiles/CMakeTmp'

  "D:/Program Files/CMake 2.8/bin/cmake.exe" -E cmake_progress_report
  D:/merge/complex/build/CMakeFiles/CMakeTmp/CMakeFiles 1

  Building C object CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o

  "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe" -o
  CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o -c
  D:/merge/complex/build/CMakeFiles/CMakeTmp/testCCompiler.c

  Linking C executable cmTryCompileExec

  "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe"
  "CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o" -o cmTryCompileExec
  -rdynamic 

  arm-none-eabi-gcc.exe: error: unrecognized option '-rdynamic'

  make.exe[1]: *** [cmTryCompileExec] Error 1

Usando Yagatdo 4.6. * Herramienta de compilación cruzada

¿Cómo puedo omitir estas pruebas o corregir el error dinámico que estoy recibiendo?

Tu respuesta

4   la respuesta
23

Parece que en realidad apuntas a algo más que a Linux, por lo que deberías decirle a cmake que estás compilando de forma cruzada para el caso genérico:

SET(CMAKE_SYSTEM_NAME Generic)

Seguido de (opcionalmente, pero agradable de especificar):

SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_CROSSCOMPILING 1)

Sin embargo, si especifica (lo que probablemente hizo porque esto se indica en muchos ejemplos en línea):

SET(CMAKE_SYSTEM_NAME Linux)

Luego, cmake cargará los archivos de configuración desde (suponga la versión 2.8) del archivo:

/usr/share/cmake-2.8/Modules/Platform/Linux.cmake

desde la cual es probable que se cargue:

/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake

Aquí el-rdynamic bandera se establece por razones históricas:

macro(__linux_compiler_gnu lang)
  # We pass this for historical reasons.  Projects may have
  # executables that use dlopen but do not set ENABLE_EXPORTS.
  set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-rdynamic")
endmacro()

En lugar de deshabilitar las pruebas como de hecho se hace especificandoNONE como elPROJECT argumento, parece establecer elCMAKE_SYSTEM_NAME (a algo mas queLinux, por ejemploGeneric) es lo que realmente quieres hacer.

Esto solucionó el problema para mí. El problema con la configuración de CMAKE_SHARED_LIBRARY_LINK_C_FLAGS es que-rdynamic se agrega incluso cuando solo estamos vinculando un ejecutable sin bibliotecas compartidas involucradas. Pero cambiar el nombre del sistema a algo que no sea Linux funcionó. Eric Hein
25

Puedes omitir las comprobaciones del compilador añadiendoNONE para ustedproject llamada:

project(<projectname> NONE)

pero esto puede tener efectos de largo alcance. Para más detalles, ejecute

cmake --help-command project

No estoy familiarizado con ARM, así que probablemente esta no sea tu mejor opción aquí. Supongo que sería mejor ver si hay una manera de arreglar el-rdynamic bandera.

EDITAR:

Parece que esto eraidentificado como un error que efectivamente sigue sin resolverse. Los comentarios en el informe de errores mencionan la adición de las siguientes líneas como una solución (probablemente antes de suproject llamada):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
@Sholy - OK, aquí está mi última conjetura :-) Intenta mirareste hilo, pero tenga en cuenta que la configuración debe hacerse antes de laproject llamada. Fraser
para ser honesto, todavía estoy intentando probar ... pero gracias ahora creo que tengo suficiente información para investigar. Cynede
@Sholy Acabo de actualizar la respuesta. Espero que esto lo solucione. Fraser
Veo pero lamentablemente obtengo el mismo resultado con esto :( Cynede
así que yagarto es el más acertado de los compiladores de brazo, no entiendo por qué el "programa simple" solicita este especial. Cynede
1

compilador pueda generar archivos binarios, debe establecer la variableCMAKE_TRY_COMPILE_TARGET_TYPE.

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

https://cmake.org/cmake/help/latest/variable/CMAKE_TRY_COMPILE_TARGET_TYPE.html

20

Puede establecer el indicador CMAKE_ <LANG> _COMPILER_WORKS, por ejemplo:

set(CMAKE_C_COMPILER_WORKS 1)

para suprimir otras verificaciones del compilador.

Es posible que también deba agregar una línea "CMAKE_CXX_COMPILER_WORKS" que coincida. Esto me funcionó en un caso en el que para un objetivo de compilación cruzada particular, CMake insistió en usar la ruta de la biblioteca incorrecta y no pudo vincular el ejecutable de prueba, pero seleccionó la ruta correcta para las compilaciones reales. Digicrat

Preguntas relacionadas