CMake添加一个库,这是一组其他库

时间:2014-02-04 19:56:06

标签: cmake

我有一个核心库,可以分支到其他几个库中。在CMakeLists.txt中,它看起来有点像这样

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 ...)

然后

TARGET_LINK_LIBRARIES (foo all-branches)

这样可行,但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认为构建这样的元库是一种可接受的方式吗?

2 个答案:

答案 0 :(得分:11)

我在即将推出的CMake 3.0.0版本中添加了一种新类型的库,即INTERFACE库。这是为解决这个问题而设计的:

http://www.cmake.org/cmake/help/git-master/manual/cmake-buildsystem.7.html#interface-libraries

add_library(all_branches INTERFACE)
target_link_libraries(all_branches INTERFACE branch1 branch2)

add_executable(myexe ...)
target_link_libraries(myexe all_branches)

答案 1 :(得分:0)

在CMAKE中,add_executable和add_library非常相似。他们只是告诉CMAKE它应该根据您在库/可执行文件的名称和选项(例如SHARED等)之后提供的src文件列表为库或可执行文件创建MAKE指令。

您可以做的是在要增加的名称变量中添加要链接的lib的名称,例如

SET(TARGET_LIBS ${TARGET_LIBS} myFirstLib)
SET(TARGET_LIBS ${TARGET_LIBS} myNextLib)

然后简单地说:

target_link_libraries(myExe  ${TARGET_LIBS})

通过这种方式,您可以轻松定义不同子项目可能需要的库的,而无需创建元库。