有没有办法指定库在 CMake 中包含哪些方法?

Is there a way to specify what methods a library contains in 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

然后,我还有其他目标 link 针对此库。 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)