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?
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
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):
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
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):
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
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.
13941400cookie-checkKann ich cmake-Compilertests überspringen oder “Fehler: nicht erkannte Option ‘-rdynamic'” vermeiden?yes