CMake添加一个库,该库是一组其他库
我有一个核心库,它可以分支到其他几个库。在CMakeLists.txt中,它看起来有点像这样CMake添加一个库,该库是一组其他库,cmake,Cmake,我有一个核心库,它可以分支到其他几个库。在CMakeLists.txt中,它看起来有点像这样 ADD_LIBRARY (core ...) ADD_LIBRARY (branch1 ...) ADD_LIBRARY (branch2 ...) ... TARGET_LINK_LIBRARIES (branch1 core) TARGET_LINK_LIBRARIES (branch2 core) ... 我有一些可执行文件,它们可能依赖于任何或所有分支。对于那些依赖于所有分支而不是书写的 AD
ADD_LIBRARY (core ...)
ADD_LIBRARY (branch1 ...)
ADD_LIBRARY (branch2 ...)
...
TARGET_LINK_LIBRARIES (branch1 core)
TARGET_LINK_LIBRARIES (branch2 core)
...
我有一些可执行文件,它们可能依赖于任何或所有分支。对于那些依赖于所有分支而不是书写的
ADD_EXECUTABLE (foo ...)
TARGET_LINK_LIBRARIES (foo branch1 branch2 ...)
我试过了
ADD_LIBRARY (all-branches)
TARGET_LINK_LIBRARIES (all-branches branch1 branch2 ...)
然后
这是可行的,但CMake发出了警告
You have called ADD_LIBRARY for library all-branches without any source files. This typically indicates a problem with your CMakeLists.txt file
我理解这个信息,但这不是一个错误。CMake认为构建这样一个元库的可接受方法是什么?在CMake中,add\u可执行文件和add\u库非常相似。他们只是告诉CMAKE,它应该根据您在库/可执行文件名称和选项(如共享等)后提供的src文件列表,为库或可执行文件创建MAKE指令 您可以做的是将要链接的LIB的名称添加到一个名称变量中,该变量可以增加,例如
SET(TARGET_LIBS ${TARGET_LIBS} myFirstLib)
SET(TARGET_LIBS ${TARGET_LIBS} myNextLib)
然后简单地说:
target_link_libraries(myExe ${TARGET_LIBS})
通过这种方式,您可以轻松定义不同子项目可能需要的库组,而无需创建元库。我在即将发布的CMake 3.0.0版本中添加了一种新类型的库,即接口库。这是为解决此问题而设计的:
我认为CMake不支持便利库。一个原因是VisualStudio没有这个概念。好的,谢谢。若我可以评论一下的话,界面给我的印象是一个糟糕的关键字选择。它暗示了其他含义。组、容器、集合等等怎么样?接口库不仅仅是一个集合、组或容器,在语义上与这些概念并不相似。这个名字适合它的用途。
target_link_libraries(myExe ${TARGET_LIBS})
add_library(all_branches INTERFACE)
target_link_libraries(all_branches INTERFACE branch1 branch2)
add_executable(myexe ...)
target_link_libraries(myexe all_branches)