【问题标题】:Using project() for dependent CMake subdirectories对依赖的 CMake 子目录使用 project()
【发布时间】:2016-06-28 08:24:11
【问题描述】:

我有几个项目,由几个库组成,每个库都位于自己的子目录中,由最顶层的 CMakeLists.txt 文件组合在一起。我习惯于在每个CMakeLists.txt 文件的顶部使用project(<DIRNAME>),并且我尝试以这样一种方式构造子项目,以便它们可以与顶级项目分开编译。但是,虽然这对于独立的核心库可能有意义,但它不适用于依赖它们的库,因为我需要做类似的事情

target_link_libraries(gui core)

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

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

【问题讨论】:

    标签: cmake project subdirectory


    【解决方案1】:

    品味问题

    在我看来,这主要是一个品味问题。我不认为多个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 解决方案可能是要走的路。
    • 简短说明:我很确定 if(NOT TARGET ...) 只有在依赖目录在此目录之前处理时才有效(例如,add_subdirectory(core) 必须在 add_subdirectory(thisone) 之前)。而不是if(NOT TARGET...),在我的实现中,我检查依赖目录是否存在。
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多