我正在使用 arm-linux-androideabi-g++
编译器 . 当我尝试编译一个简单的"Hello, World!"程序时,它编译得很好 . 当我通过在该代码中添加一个简单的异常处理来测试它时它也可以工作(在添加 -fexceptions
之后......我猜它默认是禁用的) .
这适用于Android设备,我只想使用CMake,而不是 ndk-build
.
例如 - first.cpp
#include <iostream>
using namespace std;
int main()
{
try{
}
catch(...)
{
}
return 0;
}
./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions
它没有问题......
The problem ...我正在尝试使用CMake文件编译该文件 .
我想将 -fexceptions
添加为标志 . 我试过了
set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )
和
set ( CMAKE_C_FLAGS "fexceptions")
它仍然显示错误 .
5 回答
假设您要添加这些标志(最好将它们声明为常量):
有几种方法可以添加它们:
现在我使用方法2 .
在较新版本的CMake中,您还可以分别使用target_compile_options和target_link_libraries为单个目标设置编译器和链接器标志(是的,后者也设置了链接器选项):
此方法的优点是您可以通过
PUBLIC
和PRIVATE
控制选项到其他依赖于此目标的目标的传播 .从CMake 3.13开始,您还可以使用target_link_options添加链接器选项,这使得意图更加清晰 .
尝试设置变量
CMAKE_CXX_FLAGS
而不是CMAKE_C_FLAGS
:变量
CMAKE_C_FLAGS
仅影响C编译器,但您正在编译C代码 .将标志添加到
CMAKE_EXE_LINKER_FLAGS
是多余的 .您还可以使用
LINK_FLAGS
属性将链接器标志添加到特定目标:如果要将此更改传播到其他目标,可以创建要链接到的虚拟目标 .
检查ucm的ucm_add_flags和ucm_add_linker_flags宏(我的一组有用的CMake宏) - 它们处理附加的编译器/链接器标志 .