如何在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 – 它们处理附加的编译器/链接器标志