如何在cmake文件中添加链接器或编译标志?

我正在使用arm-linux-androideabi-g++编译器。 当我尝试编译一个简单的“hello world”程序时,它编译得很好。 当我通过在代码中添加一个简单的exception处理来testing它时,它也可以工作(在添加-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" ) 

 set ( CMAKE_C_FLAGS "fexceptions") 

它仍然显示一个错误。

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

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

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

  1. 最简单的一个(不干净但简单方便,只能用于编译标志,C&C ++):

     add_definitions(${GCC_COVERAGE_COMPILE_FLAGS}) 
  2. 附加到相应的cmakevariables

     SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" ) SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" ) 
  3. 使用目标属性,参见 doc cmake编译标志目标属性,并需要知道目标名称。

     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} ) 

现在我使用方法2。

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

 target_compile_options(first-test PRIVATE -fexceptions) 

这种方法的优点是你可以通过PUBLICPRIVATE控制选项传播到依赖这个的其他目标。

尝试设置variablesCMAKE_CXX_FLAGS而不是CMAKE_C_FLAGS

 set (CMAKE_CXX_FLAGS "-fexceptions") 

variablesCMAKE_C_FLAGS只影响C编译器,但是你正在编译C ++代码。

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

检查ucm (我有用的cmakemacros)的ucm_add_flags和ucm_add_linker_flagsmacros – 它们处理附加的编译器/链接器标志