Frage an c, cross-compiling, cmake – Kann ich cmake-Compilertests überspringen oder "Fehler: Unbekannte Option '-rdynamic'" vermeiden?

26

Kompilierungsoptionen für cmake (unter Windows) für das ARM-Zielsystem, aber wenn ich configure ausführe, werden Compilertests gestartet:

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

Verwenden von Yagatdo 4.6. * Cross-Compilation-Toolchain

Wie kann ich diese Tests überspringen oder den dynamischen Fehler beheben, den ich erhalte?

Deine Antwort

4   die antwort
23

Es scheint, dass Sie tatsächlich etwas anderes als Linux als Ziel haben. Sie sollten cmake daher mitteilen, dass Sie für den generischen Fall eine Cross-Kompilierung durchführen:

SET(CMAKE_SYSTEM_NAME Generic)

Gefolgt von (optional, aber nett anzugeben):

SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_CROSSCOMPILING 1)

Wenn Sie jedoch angeben (was Sie wahrscheinlich getan haben, weil dies in vielen Beispielen online angegeben ist):

SET(CMAKE_SYSTEM_NAME Linux)

Dann lädt cmake die Konfigurationsdateien aus der Datei (angenommen Version 2.8):

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

von dem es wahrscheinlich geladen wird:

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

Hier die-rdynamic Flagge ist aus historischen Gründen gesetzt:

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()

Anstatt die Tests zu deaktivieren, wie dies in der Tat durch die Angabe erfolgtNONE als diePROJECT Argument, es scheint die EinstellungCMAKE_SYSTEM_NAME zu etwas anderem alsLinux, zum BeispielGeneric) ist das, was du eigentlich machen willst.

Dies hat das Problem für mich behoben. Das Problem beim Festlegen von CMAKE_SHARED_LIBRARY_LINK_C_FLAGS ist das-rdynamic wird hinzugefügt, auch wenn wir nur eine ausführbare Datei ohne gemeinsam genutzte Bibliotheken verknüpfen. Aber das Ändern des Systemnamens in etwas anderes als Linux hat funktioniert. Eric Hein
20

Sie können das Flag CMAKE_ <LANG> _COMPILER_WORKS setzen, zB:

set(CMAKE_C_COMPILER_WORKS 1)

weitere Compilerprüfungen zu unterdrücken.

Möglicherweise müssen Sie auch eine übereinstimmende Zeile "CMAKE_CXX_COMPILER_WORKS" hinzufügen. Dies funktionierte für mich in einem Fall, in dem CMake für ein bestimmtes kompilierungsübergreifendes Ziel darauf bestand, den falschen Bibliothekspfad zu verwenden, und die ausführbare Testdatei nicht verknüpfte, aber den richtigen Pfad für echte Builds auswählte. Digicrat
1

Wenn Sie nur eine statische Bibliothek kompilieren und nicht testen möchten, ob der Compiler Binärdateien generieren kann, können Sie die Variable festlegenCMAKE_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

25

Sie können die Compilerprüfungen durch Hinzufügen überspringenNONE zu deinemproject Anruf:

project(<projectname> NONE)

Dies kann jedoch weitreichende Auswirkungen haben. Ausführliche Informationen finden Sie unter Ausführen

cmake --help-command project

ARM ist mir nicht vertraut, daher ist dies hier wahrscheinlich nicht die beste Option. Ich denke, Sie sollten besser nachsehen, ob es eine Möglichkeit gibt, das Problem zu beheben-rdynamic Flagge.

BEARBEITEN:

Es sieht so ausals Fehler identifiziert das ist effektiv immer noch ungelöst. Die Kommentare im Fehlerbericht erwähnen das Hinzufügen der folgenden Zeilen als Problemumgehung (vermutlich vor Ihrerproject Anruf):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
yagarto ist also afaik der vernünftigste Armcompiler, ich verstehe nicht, warum "einfaches Programm" dieses Special anfordert. Cynede
@Sholy Ich habe gerade die Antwort aktualisiert - hoffe, das behebt es für Sie. Fraser
Ich sehe, aber ich bekomme leider die gleiche Ausgabe :( Cynede
@Sholy - OK, hier ist meine letzte Vermutung :-) Schau es dir andieser ThreadBeachten Sie jedoch, dass die Einstellungen vor dem erfolgen solltenproject Anruf. Fraser
um ehrlich zu sein, es wird immer noch versucht zu testen ... aber danke, ich glaube jetzt habe ich genug Informationen für die Recherche. Cynede

Verwandte Fragen