J'utilise le arm-linux-androideabi-g++
compilateur. Quand j'essaye de compiler un simple "Bonjour, monde!" programme il compile très bien. Lorsque je le teste en ajoutant une gestion d'exception simple dans ce code, cela fonctionne aussi (après l'ajout -fexceptions
.. je suppose qu'il est désactivé par défaut).
C'est pour un appareil Android, et je veux seulement utiliser CMake, pas ndk-build
.
Par exemple - first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
Ça marche sans problème ...
Le problème ... J'essaie de compiler le fichier avec un fichier CMake.
Je veux ajouter le en -fexceptions
tant que drapeau. J'ai essayé avec
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
et
set ( CMAKE_C_FLAGS "fexceptions")
Il affiche toujours une erreur.
Réponses:
Supposons que vous souhaitiez ajouter ces indicateurs (mieux vaut les déclarer dans une constante):
Il existe plusieurs façons de les ajouter:
Le plus simple (pas propre, mais facile et pratique, et ne fonctionne que pour compiler des drapeaux, C & C ++ à la fois):
Ajout aux variables CMake correspondantes:
Utilisation des propriétés cibles, cf. doc CMake compile la propriété cible de l'indicateur et doit connaître le nom de la cible.
En ce moment, j'utilise la méthode 2.
la source
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")
est plus court et plus propre queset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
Dans les versions plus récentes de CMake, vous pouvez définir des indicateurs de compilateur et de l'éditeur de liens pour une cible unique avec
target_compile_options
ettarget_link_libraries
respectivement (oui, ce dernier définit également les options de l'éditeur de liens):L'avantage de cette méthode est que vous pouvez contrôler la propagation des options vers d'autres cibles qui dépendent de celle-ci via
PUBLIC
etPRIVATE
.Depuis CMake 3.13, vous pouvez également utiliser
target_link_options
pour ajouter des options de l'éditeur de liens, ce qui rend l'intention plus claire.la source
target_compile_options(main_static PRIVATE --static)
mais ça ne semble pas fonctionner, une idée pourquoi?-static
est probablement un éditeur de liens, pas une option de compilation. Essayez de le transmettre àtarget_link_libraries
.target_link_libraries
j'ai raté cette partie du document: "Spécifiez les bibliothèques ou les drapeaux à utiliser lors de la liaison d'une cible donnée.". Merci.target_link_options
comme un moyen plus propre de spécifier les indicateurs de l'éditeur de liens. Vous devriez éviter d'utilisertarget_link_libraries
des indicateurs pour l'éditeur de liens à l'avenir et utiliser à latarget_link_options
place.Essayez de définir la variable
CMAKE_CXX_FLAGS
au lieu deCMAKE_C_FLAGS
:La variable
CMAKE_C_FLAGS
affecte uniquement le compilateur C, mais vous compilez du code C ++.L'ajout de l'indicateur à
CMAKE_EXE_LINKER_FLAGS
est redondant.la source
Vous pouvez également ajouter des indicateurs de l'éditeur de liens à une cible spécifique à l'aide de la
LINK_FLAGS
propriété:Si vous souhaitez propager cette modification vers d'autres cibles, vous pouvez créer une cible factice à laquelle vous souhaitez vous lier.
la source
Commander les ucm_add_flags et ucm_add_linker_flags macros de UCM (mon ensemble de macros CMake utiles) - ils traitent avec des drapeaux compilateur - jointes / éditeur de liens.
la source