如何在CMake文件中添加链接器或编译标志?我正在使用arm-linux-androideabi-g++编译器。当我尝试编译一个简单的“你好,世界!” 程序编译好。当我通过在该代码中添加一个简单的异常处理来测试它时它也可以工作(添加之后-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")它仍然显示错误。
3 回答
尚方宝剑之说
TA贡献1788条经验 获得超4个赞
假设您要添加这些标志(最好将它们声明为常量):
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")SET(GCC_COVERAGE_LINK_FLAGS "-lgcov")
有几种方法可以添加它们:
最简单的(不干净,但简单方便,只适用于编译标志,C&C ++一次):
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
附加到相应的CMake变量:
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 stringelse() SET(TEMP "${TEMP} ") # A space to cleanly separate from existing contentendif()# Append our valuesSET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" )set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )
现在我使用方法2。
三国纷争
TA贡献1804条经验 获得超7个赞
在较新版本的CMake中,您可以分别使用target_compile_options
和设置单个目标的编译器和链接器标志target_link_libraries
(是的,后者也设置链接器选项):
target_compile_options(first-test PRIVATE -fexceptions)
这种方法的优点是你可以控制选项传播到依赖于这个PUBLIC
和/的其他目标PRIVATE
。
从CMake 3.13开始,您还可以使用target_link_options
添加链接器选项,使意图更清晰。
婷婷同学_
TA贡献1844条经验 获得超8个赞
尝试设置变量CMAKE_CXX_FLAGS
而不是CMAKE_C_FLAGS
:
set (CMAKE_CXX_FLAGS "-fexceptions")
该变量CMAKE_C_FLAGS
仅影响C编译器,但您正在编译C ++代码。
添加标志CMAKE_EXE_LINKER_FLAGS
是多余的。
添加回答
举报
0/150
提交
取消