有没有办法指定库在 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)
我有一个 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)