是否有一种方法来指定CMake中包含的库的方法?



我有一个CMake项目,我使用一些选项来控制最终库实际实现的内容。像这样(伪代码):

// CMakeLists.txt
option(ADD_BAR "Include the bar methods" ON)
configure_file(...)
add_library(foo SHARED foo.cpp)
// foo.cpp
void doFoo(){
...
}
#ifdef ADD_BAR
void bar(){
...
}
#endif

然后,我有指向这个库的其他目标。在CMake中是否有一种方法可以检测bar()是否存在于最终的libfoo.so中,或者该目标是在禁用此选项的情况下编译的?基本上,我想传播关于库是如何编译的信息(例如,使用哪些启用的选项),这样我就可以跳过使用它但需要不支持的特性的下游目标。

首先,让我们有一个宏,它产生一段代码来检查符号是否被定义,并为编译器添加一个相关的宏定义:

macro (add_definition_if_var symbol)
if (${symbol})
add_compile_definitions (${symbol})
endif ()
endmacro ()

那么,就像这样简单:

option (ADD_BAR "Include the bar methods" ON)
add_definition_if_var (ADD_BAR)

并且,如果ADD_BAR被设置为ON,ADD_BAR宏将在您的库项目中定义:)

如果你有很多这样的选项,你可以一次完成:

function (defining_option var description state)
option (${var} "${description}" ${state})
if (${var})
add_compile_definitions (${var})
endif ()
endfunction ()

defining_option (ADD_BAR "Include the bar methods" ON)
defining_option (ADD_FROB "Frobnicate" OFF)

最新更新