Kann ich cmake-Compilertests überspringen oder “Fehler: nicht erkannte Option ‘-rdynamic'” vermeiden?

Lesezeit: 4 Minuten

Kompilierungsoptionen für cmake (unter Windows) für das ARM-Zielsystem, aber wenn ich configure ausführe, werden Compiler-Tests 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

Verwendung der Cross-Compilation-Toolchain von Yagatdo 4.6.*

Wie kann ich diese Tests überspringen oder den -rdynamic-Fehler beheben, den ich bekomme?

Benutzeravatar von adiog
adiog

Sie können einstellen CMAKE_<LANG>_COMPILER_WORKS auf true setzen, um weitere Compiler-Prüfungen für diese Sprache zu unterdrücken.

set(CMAKE_C_COMPILER_WORKS 1)

  • Möglicherweise müssen Sie auch eine passende „CMAKE_CXX_COMPILER_WORKS“-Zeile hinzufügen. Dies funktionierte für mich in einem Fall, in dem CMake für ein bestimmtes Cross-Compilation-Ziel darauf bestand, den falschen Bibliothekspfad zu verwenden und die ausführbare Testdatei nicht zu verknüpfen, aber den richtigen Pfad für echte Builds aufgriff.

    – Digikrat

    11. April 2018 um 15:30 Uhr

Benutzeravatar von Fraser
Fraser

Sie können die Compilerprüfungen überspringen, indem Sie hinzufügen NONE zu deinem project Anruf:

project(<projectname> NONE)

aber das kann ziemlich weitreichende Auswirkungen haben. Für vollständige Details führen Sie

cmake --help-command project

Ich bin mit ARM 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 aus als Bug identifiziert die effektiv noch ungelöst ist. Die Kommentare im Fehlerbericht erwähnen das Hinzufügen der folgenden Zeilen als Problemumgehung (vermutlich vor Ihrer project Anruf):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")

  • Yagarto ist also der vernünftigste Arm-Compiler, ich verstehe nicht, warum “einfaches Programm” dieses Special anfordert.

    – cnd

    15. Mai 2012 um 11:21 Uhr

  • @Sholy Ich habe gerade die Antwort aktualisiert – hoffe, das behebt das Problem für Sie.

    – Frazer

    15. Mai 2012 um 12:08 Uhr

  • Ich verstehe, aber ich bekomme leider die gleiche Ausgabe damit 🙁

    – cnd

    15. Mai 2012 um 12:11 Uhr

  • @Sholy – OK, hier ist meine letzte Vermutung 🙂 Versuchen Sie, es sich anzusehen dieser Fadenaber beachten Sie, dass die Einstellungen vor dem vorgenommen werden sollten project Anruf.

    – Frazer

    15. Mai 2012 um 12:18 Uhr

  • Um ehrlich zu sein, wird es immer noch versucht zu testen … aber danke, jetzt habe ich genug Informationen für die Recherche.

    – cnd

    15. Mai 2012 um 12:35 Uhr


Benutzeravatar von Anne van Rossum
Anne van Rossum

Es scheint, dass Sie tatsächlich auf etwas anderes als Linux abzielen, also sollten Sie cmake mitteilen, dass Sie für den generischen Fall crosskompilieren:

SET(CMAKE_SYSTEM_NAME Generic)

Gefolgt von (optional, aber nett zu spezifizieren):

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 (angenommen Version 2.8) der Datei:

/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 Flag 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 tatsächlich durch die Angabe erfolgt NONE als die PROJECT Argument, scheint es die Einstellung CMAKE_SYSTEM_NAME (zu etwas anderem als Linuxzum Beispiel Generic) 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, selbst wenn wir nur eine ausführbare Datei ohne Beteiligung von gemeinsam genutzten Bibliotheken verknüpfen. Aber das Ändern des Systemnamens in etwas anderes als Linux hat funktioniert.

    – Eric Hein

    17. Januar 2017 um 23:58 Uhr

awelkies Benutzeravatar
awelkie

Wenn Sie nur eine statische Bibliothek kompilieren und vermeiden möchten, dass CMake testet, ob der Compiler Binärdateien generieren kann, können Sie die Variable festlegen CMAKE_TRY_COMPILE_TARGET_TYPE.

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

Beim Crosskompilieren für Windows, wo es keine Option -rdynamic gibt, können Sie verwenden

-DCMAKE_SYSTEM_NAME="Windows"

mit cmake. Dann überspringt Cmake den Test mit -rdynamic.

1394140cookie-checkKann ich cmake-Compilertests überspringen oder “Fehler: nicht erkannte Option ‘-rdynamic'” vermeiden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy