Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake添加一个库,该库是一组其他库_Cmake - Fatal编程技术网

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

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

我有一个核心库,它可以分支到其他几个库。在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 ...)
然后

这是可行的,但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)