【问题标题】:How to get a VS solution with all the projects and solutions for single projects with CMake如何使用 CMake 获得包含所有项目的 VS 解决方案和单个项目的解决方案
【发布时间】:2018-05-16 22:04:40
【问题描述】:

TL;DR 我基本上想要this question 的模块化解决方案。不仅是一个包含所有内容的解决方案,而且还为每个可执行文件单独提供一个解决方案。


在我的问题here 中,我想知道如何将我的 CMakeLists.txt 拆分到不同的文件夹中。一些文件夹包含将是静态库的代码,而一些代码将是构建在这些静态库上的可执行文件或动态库。

文件夹结构如下:

/path/to/base/
  CMakeLists.txt
  app1/
    <src files for app1>
    CMakeLists.txt
  app2/
    <src files for app2>
    CMakeLists.txt
  lib/
    <src files for lib>
    CMakeLists.txt

如果我采取在父文件夹中有一个CMakeLists.txt 的方法到我的所有库和可执行文件,并从包含所有目录中,我遇到的问题是,当我生成每个目标的项目包含的 VS 项目/解决方案时所有项目 - 不仅是我预期目标所必需的项目。

基础文件夹中CMakeLists.txt 的内容:

cmake_minimum_required(VERSION 3.1)

add_subdirectory(lib)
add_subdirectory(app1)
add_subdirectory(app2)

和app1文件夹中的CMakeLists.txt(app2等价)

cmake_minimum_required(VERSION 3.1)

project(app1)

add_executable(app1 <src of app1>)

target_link_libraries(app1 lib)

和 CMakeLists.txt 的 lib:

add_library(lib <src of lib>)

如果我在 CMakeLists.txt 上运行 cmake,则解决方案包含所有项目。即使我只打开一个项目;它也包含一切。 app1 的 VS 项目也构建了 app2 - 这是我不想要的。

如果我只在 app1 的 CMakeLists.txt 上运行 cmake,我会得到一个不包含 app2 但也不包含 lib 的解决方案,因为这只是在 cmake 文件内部链接时提到的,而不是作为目标(它在基本文件中)

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    CMake 将为每次调用 project 创建一个解决方案,然后将包括当前目录及其子目录的所有目标(无论它们是在实际调用 project 之前还是之后定义的)。

    以下是行为良好的 CMake 脚本应该执行的操作:您希望能够在较大项目中充当其自己的子树的根的每个 CMakeList 应以 cmake_minimum_required 调用开头,然后是 @ 987654326@电话。在 CMakeLists 中写 project 基本上意味着:这是一个完全独立的组件,可以独立构建,即使您从其父目录中删除所有文件。因此,为每个这样的project 提供单独的解决方案是有意义的。

    考虑到这一点,我们可以看到为什么这在您的情况下不起作用:您的应用程序不是完全独立的,它们依赖于 lib。解决方案是为应用程序编写构建脚本,就好像 lib 作为第三方组件提供一样,带有find_package 调用和所有内容。 在复合构建中,您已经有了 lib 的目标,因此应该使 find_package 调用调用的脚本短路以使用该目标,并且只有在它出现时才真正去清理系统找不到现有的目标。

    还阅读了CMake's packaging system 的工作原理,它提供了一些自动化来非常优雅地处理此类情况。

    【讨论】:

    • 感谢您的回答。当你说“......与find_package 通话和一切”。你能详细说明“和一切”的含义吗?我将开始阅读您提供的链接。
    • @Philipp 只是你不应该对 lib 做出任何假设,如果你不是它的作者,你就不会有这些假设。像对待任何其他不受您控制的第三方依赖项一样对待它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多