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


如何在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")

它仍然显示错误。


子衿沉夜
浏览 3026回答 3
3回答

尚方宝剑之说

假设您要添加这些标志(最好将它们声明为常量):SET(GCC_COVERAGE_COMPILE_FLAGS&nbsp;"-fprofile-arcs&nbsp;-ftest-coverage")SET(GCC_COVERAGE_LINK_FLAGS&nbsp;&nbsp;&nbsp;&nbsp;"-lgcov")有几种方法可以添加它们:最简单的(不干净,但简单方便,只适用于编译标志,C&C ++一次):add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})附加到相应的CMake变量:SET(CMAKE_CXX_FLAGS&nbsp;&nbsp;"${CMAKE_CXX_FLAGS}&nbsp;${GCC_COVERAGE_COMPILE_FLAGS}")SET(CMAKE_EXE_LINKER_FLAGS&nbsp;&nbsp;"${CMAKE_EXE_LINKER_FLAGS}&nbsp;${GCC_COVERAGE_LINK_FLAGS}")使用目标属性,参见&nbsp;doc&nbsp;CMake编译标志目标属性,需要知道目标名称。get_target_property(TEMP&nbsp;${THE_TARGET}&nbsp;COMPILE_FLAGS)if(TEMP&nbsp;STREQUAL&nbsp;"TEMP-NOTFOUND") &nbsp;&nbsp;SET(TEMP&nbsp;"")&nbsp;#&nbsp;Set&nbsp;to&nbsp;empty&nbsp;stringelse() &nbsp;&nbsp;SET(TEMP&nbsp;"${TEMP}&nbsp;")&nbsp;#&nbsp;A&nbsp;space&nbsp;to&nbsp;cleanly&nbsp;separate&nbsp;from&nbsp;existing&nbsp;contentendif()#&nbsp;Append&nbsp;our&nbsp;valuesSET(TEMP&nbsp;"${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}"&nbsp;)set_target_properties(${THE_TARGET}&nbsp;PROPERTIES&nbsp;COMPILE_FLAGS&nbsp;${TEMP}&nbsp;)现在我使用方法2。

三国纷争

在较新版本的CMake中,您可以分别使用target_compile_options和设置单个目标的编译器和链接器标志target_link_libraries(是的,后者也设置链接器选项):target_compile_options(first-test&nbsp;PRIVATE&nbsp;-fexceptions)这种方法的优点是你可以控制选项传播到依赖于这个PUBLIC和/的其他目标PRIVATE。从CMake 3.13开始,您还可以使用target_link_options添加链接器选项,使意图更清晰。

婷婷同学_

尝试设置变量CMAKE_CXX_FLAGS而不是CMAKE_C_FLAGS:set&nbsp;(CMAKE_CXX_FLAGS&nbsp;"-fexceptions")该变量CMAKE_C_FLAGS仅影响C编译器,但您正在编译C ++代码。添加标志CMAKE_EXE_LINKER_FLAGS是多余的。
打开App,查看更多内容
随时随地看视频慕课网APP