在根CMakeLists.txt中,我有

add_definition(-DMY_MACRO)

然后在子CMakeLists.txt中,我想做类似的事情
add_library(mylib, STATIC
    file1
#ifdef MY_MACRO
    file2
#endif
)

我尝试了类似的东西
IF( DEFINED MY_MACRO )
SET(FILE2 "file2")
ELSE( DEFINED MY_MACRO )
SET(FILE2 "")
END_IF( DEFINED MY_MACRO )

add_library(mylib static
    file1
    ${FILE2}
)

但没有喜悦。

最佳答案

add_definitions添加一个预处理程序定义,它没有定义cmake变量。

我还没有测试过,但是如果您真的想寻找预处理器定义,也许更多的是这样的:

set(mylib_SOURCES )
list(APPEND mylib_SOURCES file1)
get_directory_property(CURRENT_DEFINITIONS COMPILE_DEFINITIONS)
list(FIND CURRENT_DEFINITIONS "MY_MACRO" IN_CURRENT_DEFINITIONS)
if(NOT IN_CURRENT_DEFINITIONS EQUAL -1)
    list(APPEND mylib_SOURCES file2)
endif(NOT IN_CURRENT_DEFINITIONS EQUAL -1)
add_library(mylib static ${mylib_SOURCES})

(定义是从此处的父目录继承的)

在您的父级CMakeLists.txt中:
add_definitions(-DMY_MACRO) # should appear before going into subdirectories
add_subdirectory(foo)

基于变量的另一种方法是:
  • parent :
    option(WITH_FOO "with(out) foo option") # or set(WITH_FOO true/false)
    if(WITH_FOO)
        add_definitions(-DMY_MACRO)
    endif(WITH_FOO)
    add_subdirectory(foo)
    
  • 子目录:
    set(mylib_SOURCES )
    list(APPEND mylib_SOURCES file1)
    if(WITH_FOO)
        list(APPEND mylib_SOURCES file2)
    endif(WITH_FOO)
    add_library(mylib static ${mylib_SOURCES})
    
  • 关于cmake - 有条件地包含源文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22376958/

    10-12 17:45