首页 文章

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

提问于
浏览
157

我正在使用 arm-linux-androideabi-g++ 编译器 . 当我尝试编译一个简单的"Hello, World!"程序时,它编译得很好 . 当我通过在该代码中添加一个简单的异常处理来测试它时它也可以工作(在添加 -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

它没有问题......

The problem ...我正在尝试使用CMake文件编译该文件 .

我想将 -fexceptions 添加为标志 . 我试过了

set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )

set ( CMAKE_C_FLAGS "fexceptions")

它仍然显示错误 .

5 回答

  • 31

    假设您要添加这些标志(最好将它们声明为常量):

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

  • 0

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

    target_compile_options(first-test PRIVATE -fexceptions)
    

    此方法的优点是您可以通过 PUBLICPRIVATE 控制选项到其他依赖于此目标的目标的传播 .

    从CMake 3.13开始,您还可以使用target_link_options添加链接器选项,这使得意图更加清晰 .

  • 107

    尝试设置变量 CMAKE_CXX_FLAGS 而不是 CMAKE_C_FLAGS

    set (CMAKE_CXX_FLAGS "-fexceptions")
    

    变量 CMAKE_C_FLAGS 仅影响C编译器,但您正在编译C代码 .

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

  • 189

    您还可以使用 LINK_FLAGS 属性将链接器标志添加到特定目标:

    set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")
    

    如果要将此更改传播到其他目标,可以创建要链接到的虚拟目标 .

  • 0

    检查ucmucm_add_flagsucm_add_linker_flags宏(我的一组有用的CMake宏) - 它们处理附加的编译器/链接器标志 .

相关问题