我使用的是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

它工作起来没有问题……

问题是……我正在尝试用CMake文件编译该文件。

我想添加-fexceptions作为标志。我试过

set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )

and

set ( CMAKE_C_FLAGS "fexceptions")

它仍然显示一个错误。


当前回答

尝试设置变量CMAKE_CXX_FLAGS而不是CMAKE_C_FLAGS:

set (CMAKE_CXX_FLAGS "-fexceptions")

变量CMAKE_C_FLAGS仅影响C编译器,但您正在编译c++代码。

将标志添加到CMAKE_EXE_LINKER_FLAGS是多余的。

其他回答

注意:考虑到CMake自2012年以来的发展,这里的大多数建议现在已经过时/过时,有更好的替代方案。


假设你想添加这些标志(最好在一个常量中声明它们):

SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS    "-lgcov")

有几种方法可以添加它们:

The easiest one (not clean, but easy and convenient, and works only for compile flags, C & C++ at once): add_definitions(${GCC_COVERAGE_COMPILE_FLAGS}) Appending to corresponding CMake variables: SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") Using target properties, cf. doc CMake compile flag target property and need to know the target name. get_target_property(TEMP ${THE_TARGET} COMPILE_FLAGS) if(TEMP STREQUAL "TEMP-NOTFOUND") SET(TEMP "") # Set to empty string else() SET(TEMP "${TEMP} ") # A space to cleanly separate from existing content endif() # Append our values SET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" ) set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )

现在我使用方法二。

在新版本的CMake中,你可以分别用target_compile_options和target_link_libraries为单个目标设置编译器和链接器标志(是的,后者也设置链接器选项):

target_compile_options(first-test PRIVATE -fexceptions)

这种方法的优点是,您可以通过PUBLIC和PRIVATE控制将选项传播到依赖于此选项的其他目标。

在CMake 3.13中,你也可以使用target_link_options来添加链接器选项,这使得意图更加明确。

使用CMake 3.4+, APPEND可以与string命令一起使用来添加标志。

string(APPEND CMAKE_EXE_LINKER_FLAGS " -fexceptions")

当我需要一个名为“NO_DEBUG”的预编译定义时,这为我工作:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -DNO_DEBUG")

然后从代码开始

#ifdef NO_DEBUG
.....

尝试设置变量CMAKE_CXX_FLAGS而不是CMAKE_C_FLAGS:

set (CMAKE_CXX_FLAGS "-fexceptions")

变量CMAKE_C_FLAGS仅影响C编译器,但您正在编译c++代码。

将标志添加到CMAKE_EXE_LINKER_FLAGS是多余的。