gpt4 book ai didi

c++ - 如何使用 CMake 获得包含所有项目的 VS 解决方案和单个项目的解决方案

转载 作者:行者123 更新时间:2023-11-30 05:01:16 26 4
gpt4 key购买 nike

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)

和lib的CMakeLists.txt:

add_library(lib <src of lib>)

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

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

最佳答案

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

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

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

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

关于c++ - 如何使用 CMake 获得包含所有项目的 VS 解决方案和单个项目的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50380556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com