使用project()来处理依赖的CMake子目录

5

我有几个项目,每个项目由一些库组成,每个库都在自己的子目录中,由顶级 CMakeLists.txt 文件连接在一起。我习惯于在每个 CMakeLists.txt 文件的顶部使用 project(<DIRNAME>),并尝试以这样的方式构建子项目,使它们可以从顶级项目分别编译。然而,虽然这对于独立的核心库可能有意义,但对于依赖于它们的库来说是行不通的,因为我需要做一些类似于以下的事情:

target_link_libraries(gui core)

如果我试图将 gui 编译为独立项目,core 将不会被定义。

在这种情况下使用 project() 是错误的吗?还是我漏掉了什么?

1个回答

2

品味问题

我认为这主要是一个品味问题。我不认为多个project()命令本身是一个问题,更多的是我见过的使用这种方法的项目在其他部分重复自己,并且有时会遇到全局缓存变量的问题。

相关库

更重要的事实是,相关库还将添加包含依赖项。

对于独立的静态库目标(不是可执行或共享库目标,真正链接库的),可以忽略简单的target_link_libraries()命令,例如:

if (TARGET core)
    target_link_libraries(gui core)
endif()

但是头文件包含依赖关系仍然存在。

CMake中的独立项目

对我而言,为了让一个(子)项目真正独立,不仅需要有project()命令,还应该有export(TARGETS ...)命令。这样就可以使用find_package()命令解决任何开放依赖,例如:

if (NOT TARGET core)
    find_package(core REQUIRED)
endif()
target_link_libraries(gui core)

参考资料


有道理。export 方案可能是最好的选择。 - Arek' Fu
只是一个快速的提示:我相当确定 if(NOT TARGET ...) 只有在依赖目录在此目录之前被处理(例如,add_subdirectory(core) 必须在 add_subdirectory(thisone) 之前)。在我的实现中,我检查依赖目录是否存在,而不是使用 if(NOT TARGET...) - cheshirekow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接