如何使用CMake获得所有项目的VS解决方案以及单个项目的解决方案

菲利普

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


这里的问题中我想知道如何将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)

CMakeLists.txtapp1文件夹中的(app2等效)

cmake_minimum_required(VERSION 3.1)

project(app1)

add_executable(app1 <src of app1>)

target_link_libraries(app1 lib)

CMakeLists.txtlib:

add_library(lib <src of lib>)

如果我在CMakeLists.txtfrom基础上运行cmake,则解决方案将包含所有项目。即使我只打开其中一个项目,它还包含所有内容。app1的VS项目也可以构建app2-我不想要。

如果仅在CMakeLists.txtapp1的cmake上运行cmake,则会得到一个不包含app2但也不包含lib的解决方案,因为仅在cmake文件内部进行链接而不是作为目标(在基本文件中)进行链接

ComicSansMS

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

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

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

还请阅读CMake的包装系统的工作原理,该系统提供了一些自动化功能,可以非常优雅地处理此类情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在具有其他项目的解决方案中编译单个项目?

如何获得解决方案项目中的所有类型?

如何部署具有多个项目的单个解决方案?

如何使用dotnet sln将所有项目添加到单个解决方案中?

在 Visual Studio 解决方案中设置所有项目的运行时库

同一命名空间如何在具有不同项目的单个解决方案中工作

如何在一处更改解决方案中所有项目的 C# 语言版本?

如何在不加载所有项目的情况下打开Visual Studio解决方案?

如何构建和部署具有多个项目的Visual Studio解决方案

如何发布具有两个依赖项项目的Visual Studio解决方案?

NuGet适用于多个项目的解决方案

同一解决方案中项目的多个版本?

解决方案 .NET 中 Docker 多个项目的问题

解决方案中的哪些项目正在使用某个项目的项目参考?

如何从解决方案中更改项目的目标版本解决错误?

使用Haskell解决Euler 25项目的慢速解决方案

构建解决方案时在命令行上传递单个项目的属性

从解决方案构建单个批次的项目

如何在VSIX项目的解决方案文件夹中获取项目

VSSDK:无法使用包含VSIX项目的混合样式csproj项目构建解决方案

如何使用VSTS构建包含.NET Standard项目和.NET 4.7项目的.NET解决方案?

在多个 VS 2017 解决方案中引用项目的工作流

使用VS 2017映像,无法在具有一个.NET Core 3项目的解决方案中构建其他项目

VC ++从解决方案中的非/ clr项目的函数中调用/ clr项目的函数

解决方案资源管理器中有多个项目的“此范围”

带有2个可执行项目的Dockerize .NET解决方案

带有多个Web项目的解决方案的VSTS构建定义

LNK2019在具有DLL项目的解决方案上

具有主要配置/索引项目的解决方案组织