如何在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") 
有几种方法可以添加它们:
- 
最简单的一个(不干净但简单方便,只能用于编译标志,C&C ++): add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
- 
附加到相应的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}" )
- 
使用目标属性,参见 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_options和target_link_libraries为单个目标设置编译器和链接器标志(是的,后者也设置链接器选项): 
 target_compile_options(first-test PRIVATE -fexceptions) 
 这种方法的优点是你可以通过PUBLIC和PRIVATE控制选项传播到依赖这个的其他目标。 
 尝试设置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 – 它们处理附加的编译器/链接器标志