Eu estou usando o arm-linux-androideabi-g++
compilador. Quando tento compilar um simples "Olá, mundo!" programa compila bem. Quando eu testo adicionando um tratamento de exceção simples nesse código, ele também funciona (depois de adicionar -fexceptions
... acho que está desativado por padrão).
Isto é para um dispositivo Android, e eu só quero usar o CMake, não ndk-build
.
Por exemplo - first.cpp
#include <iostream>
using namespace std;
int main()
{
try
{
}
catch (...)
{
}
return 0;
}
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
Funciona sem problemas ...
O problema ... Estou tentando compilar o arquivo com um arquivo CMake.
Quero adicionar o -fexceptions
como uma bandeira. Eu tentei com
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
e
set ( CMAKE_C_FLAGS "fexceptions")
Ele ainda exibe um erro.
Respostas:
Suponha que você queira adicionar esses sinalizadores (melhor declá-los em uma constante):
Existem várias maneiras de adicioná-los:
A mais fácil (não limpa, mas fácil e conveniente e funciona apenas para sinalizadores de compilação, C & C ++ de uma só vez):
Anexando às variáveis CMake correspondentes:
Usando propriedades de destino, cf. doc CMake compila a propriedade de destino do sinalizador e precisa saber o nome do destino.
Agora eu uso o método 2.
fonte
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")
é mais curto e limpo do queset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
Nas versões mais recentes do CMake, você pode definir sinalizadores de compilador e vinculador para um único destino com
target_compile_options
etarget_link_libraries
respectivamente (sim, o último também define opções de vinculador):A vantagem desse método é que você pode controlar a propagação de opções para outros destinos que dependem desse via
PUBLIC
ePRIVATE
.No CMake 3.13, você também pode usar
target_link_options
para adicionar opções de vinculador, o que torna a intenção mais clara.fonte
target_compile_options(main_static PRIVATE --static)
mas não parece funcionar, alguma idéia do porquê?-static
provavelmente é um vinculador, não uma opção do compilador. Tente passá-lo paratarget_link_libraries
.target_link_libraries
eu perdi essa parte do documento: "Especifique bibliotecas ou sinalizadores para usar ao vincular um determinado destino". Obrigado.target_link_options
como uma maneira mais limpa de especificar sinalizadores de vinculador. Você deve evitar o usotarget_link_libraries
de sinalizadores de vinculador no futuro e usá-lotarget_link_options
.Tente definir a variável em
CMAKE_CXX_FLAGS
vez deCMAKE_C_FLAGS
:A variável
CMAKE_C_FLAGS
afeta apenas o compilador C, mas você está compilando código C ++.Adicionar o sinalizador a
CMAKE_EXE_LINKER_FLAGS
é redundante.fonte
Você também pode adicionar sinalizadores de vinculador a um destino específico usando a
LINK_FLAGS
propriedade:Se você deseja propagar essa alteração para outros destinos, é possível criar um destino fictício ao qual vincular.
fonte
Faça check - out das macros ucm_add_flags e ucm_add_linker_flags da ucm (meu conjunto de macros úteis do CMake) - elas lidam com anexos de sinalizadores de compilador / vinculador.
fonte