Ich benutze den arm-linux-androideabi-g++
Compiler. Wenn ich versuche, ein einfaches "Hallo Welt!" Programm kompiliert es gut. Wenn ich es durch Hinzufügen einer einfachen Ausnahmebehandlung in diesem Code teste, funktioniert es auch (nach dem Hinzufügen -fexceptions
.. Ich denke, es ist standardmäßig deaktiviert).
Dies ist für ein Android-Gerät und ich möchte nur CMake verwenden, nicht ndk-build
.
Zum Beispiel - first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
Es funktioniert ohne Probleme ...
Das Problem ... Ich versuche, die Datei mit einer CMake-Datei zu kompilieren.
Ich möchte das -fexceptions
als Flagge hinzufügen . Ich habe es mit versucht
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
und
set ( CMAKE_C_FLAGS "fexceptions")
Es wird weiterhin ein Fehler angezeigt.
Antworten:
Angenommen, Sie möchten diese Flags hinzufügen (besser deklarieren Sie sie in einer Konstanten):
Es gibt verschiedene Möglichkeiten, sie hinzuzufügen:
Die einfachste (nicht sauber, aber einfach und bequem und funktioniert nur für das gleichzeitige Kompilieren von Flags, C & C ++):
Anhängen an entsprechende CMake-Variablen:
Unter Verwendung von Zieleigenschaften vgl. doc CMake kompiliert Flag-Zieleigenschaft und muss den Zielnamen kennen.
Im Moment benutze ich Methode 2.
quelle
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")
ist kürzer und sauberer alsset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
In neueren Versionen von CMake können Sie Compiler und Linker - Flags für ein einzelnes Ziel mit gesetzt
target_compile_options
undtarget_link_libraries
jeweils (ja, die letzteren Sätze Linker - Optionen zu):Der Vorteil dieser Methode besteht darin, dass Sie die Weitergabe von Optionen an andere Ziele steuern können, die von diesem über
PUBLIC
und abhängenPRIVATE
.Ab CMake 3.13 können Sie auch
target_link_options
Linker-Optionen hinzufügen, um die Absicht klarer zu machen.quelle
target_compile_options(main_static PRIVATE --static)
aber es scheint nicht zu funktionieren, eine Idee warum?-static
ist wahrscheinlich ein Linker, keine Compiler-Option. Versuchen Sie es weiterzugebentarget_link_libraries
.target_link_libraries
ich habe diesen Teil des Dokuments verpasst: "Geben Sie Bibliotheken oder Flags an, die beim Verknüpfen eines bestimmten Ziels verwendet werden sollen." Vielen Dank.target_link_options
eine übersichtlichere Möglichkeit, Linker-Flags anzugeben. Sie sollten die Verwendungtarget_link_libraries
von Linker-Flags in Zukunft vermeiden undtarget_link_options
stattdessen verwenden.Versuchen Sie, die Variable
CMAKE_CXX_FLAGS
anstelle vonCMAKE_C_FLAGS
:Die Variable
CMAKE_C_FLAGS
wirkt sich nur auf den C-Compiler aus, Sie kompilieren jedoch C ++ - Code.Das Hinzufügen des Flags zu
CMAKE_EXE_LINKER_FLAGS
ist redundant.quelle
Sie können einem bestimmten Ziel auch Linker-Flags hinzufügen, indem Sie die
LINK_FLAGS
Eigenschaft verwenden:Wenn Sie diese Änderung auf andere Ziele übertragen möchten, können Sie ein Dummy-Ziel erstellen, mit dem eine Verknüpfung hergestellt werden soll.
quelle
Kasse die ucm_add_flags und ucm_add_linker_flags Makros von UCM (meine Reihe von nützlichen CMake Makros) - sie mit Anhängen Compiler / Linker - Flags beschäftigen.
quelle