cmake try_compile 踩坑

cmake try_compile 踩坑

踩坑的代码


function(cxx_flags result)
    set(multi_values_keyword COMPILER_FLAGS LINKER_FLAGS)

    cmake_parse_arguments(
        arg
        ""
        ""
        "${multi_values_keyword}"
        ${ARGN}
    )

    if(arg_UNPARSED_ARGUMENTS)
        message(FATAL_ERROR "Unrecognized arguments: ${arg_UNPARSED_ARGUMENTS}")
    endif()
    
    if(arg_KEYWORDS_MISSING_VALUES)
        message(FATAL_ERROR "Expect arguments followed: ${arg_KEYWORDS_MISSING_VALUES}")
    endif()

    try_compile(
        compile_ok
        SOURCE_FROM_CONTENT dummy.cpp "int main(){return 0;}"
        #CMAKE_FLAGS -DCMAKE_CXX_FLAGS="${arg_COMPILER_FLAGS}"
        COMPILE_DEFINITIONS ${arg_COMPILER_FLAGS}
        LINK_OPTIONS ${arg_LINKER_FLAGS}
    )

    if(compile_ok)
        set(${result} ${compile_ok} PARENT_SCOPE)
    else()
        message(FATAL_ERROR "CXX flags error")
    endif()

endfunction()

注释掉的code就是bug所在。

Option

先看下这两个选项的文档

CMAKE_FLAGS <flags>...
Specify flags of the form -DVAR:TYPE=VALUE to be passed to the cmake(1) command-line used to drive the test build. The above example shows how values for variables COMPILE_DEFINITIONS, INCLUDE_DIRECTORIES, LINK_DIRECTORIES, LINK_LIBRARIES, and LINK_OPTIONS are used. Compiler options can be passed in like CMAKE_FLAGS -DCOMPILE_DEFINITIONS=-Werror.

COMPILE_DEFINITIONS <defs>...
Specify -Ddefinition arguments to pass to add_definitions() in the generated test project.

按照文档的意思,我认为CMAKE_CXX_FLAGS会传递进去,但实际上try_compile生成的代码如下

set(CMAKE_VERBOSE_MAKEFILE 1)
set(CMAKE_CXX_FLAGS "")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_DEFINITIONS}")
set(CMAKE_CXX_FLAGS_DEBUG "-g")

可以看到CMAKE_CXX_FLAGS直接被设置成空(根据cmake language, -D传进来的是cache变量,这里显式地设置了普通变量,会覆盖掉cache变量),再添加COMPILE_DEFINITIONS,代码CMAKE_FLAGS -DCMAKE_CXX_FLAGS="${arg_COMPILER_FLAGS}"根本没用。

唯一的方法是下面的COMPILE_DEFINITIONS,像macro一样传递进去。

posted @ 2026-07-16 23:06  杨忆州  阅读(1)  评论(0)    收藏  举报