c++ - 如何使用 CMake 创建具有多个 Visual Studio 项目的 Visual Studio 解决方案?

标签 c++ visual-studio cmake visual-studio-2022

我想使用 Visual Studio 在 Windows 中使用 CMake 创建一个项目(我使用的特定版本是 2022),我以前从未在 Windows 中使用过 CMake,所以我只是按照 Visual Studio 对我说的进行操作。

我想要一个项目结构,其中有一个生成可执行文件的 App 目录,一个生成 dll 共享库的 Engine 文件夹。

我想单独运行它们,所以当我完成引擎并按运行时,我只希望项目生成 dll 文件,而不对 App 目录执行任何操作。

然后,当我运行App时,我希望它生成一个依赖于Engine创建的dll的exe,而不是重新生成Engine目录。

我希望它们位于相同的解决方案上,如下所示:

Project/
├─ libs/
├─ README.md
├─ Solutionfile_or_smthng.vprojx
├─ App/
│  ├─ include/
│  ├─ src/
│  ├─ CMakeLists.txt
│  ├─ main.cpp
├─ Engine/
│  ├─ src/
│  ├─ include/
│  ├─ Engine.hpp
│  ├─ CMakeLists.txt
├─ .gitignore

通常,当创建 Visual Studio 项目时,它会创建一个解决方案,我只需右键单击该解决方案即可添加项目并进行相应配置。但是当我创建一个 cmake 项目时,它只给了我一个文件夹,并且当我右键单击它时没有添加项目

enter image description here

它不一定是一个解决方案,只要我在同一 View 中实现 2 个单独的构建就可以了。事实上我宁愿没有解决方案。

现在的问题是,据我了解,Visual Studio 将一个 CMakeLists.txt 文件放在项目的根目录中,当我按构建时它会运行该文件。现在,当我手动添加文件夹时,我的项目结构如下所示:

MyProject/
├─ libs/
├─ App/
│  ├─ src/
│  ├─ include/
│  ├─ main.cpp
│  ├─ CMakeLists.txt
├─ Engine/
│  ├─ include/
│  ├─ src/
│  ├─ CMakeLists.txt
│  ├─ Engine.hpp
├─ .gitignore
├─ CMakeLists.txt

我不想让单个 CMakeLists.txt 文件运行一次。如果我必须做两个单独的项目,我如何在同一个窗口上查看它们以及如何让应用程序看到从引擎生成的 dll?

最佳答案

CMakeLists.txt 不会“按构建时运行”。这是一个配置文件。它用于配置 CMake(“教导”CMake 如何)生成特定类型的构建系统(这里是 Visual Studio 解决方案)。构建系统的配置与调用构建系统来执行构建是分开的。只需为该项目编写一个 CMakeLists.txt 文件,就像为任何平台编写一样(您的前几句话似乎暗示您已经在其他平台上使用过它)。您可以为 Windows 做一些特殊的事情,但我认为这里没有特别的需要。您有两个 CMake 目标,它们会变成两个 VS 项目。生成 VS 构建系统(解决方案文件)后,像通常在 VS GUI 中一样构建每个项目。

现在,考虑到您的文件布局,您可能需要以下内容:

MyProject/CMakeLists.txt:

cmake_minimum_required(VERSION 3.25) # or whatever is suitable/available for you
project(MyProject CXX)

link_directories(libs)
add_subdirectory(Engine)
add_subdirectory(App)

MyProject/Engine/CMakeLists.txt:

add_library(Engine SHARED src/foo.cpp src/bar.cpp src/baz.cpp)
target_include_directories(Engine PUBLIC include .) # . is for your Engine.hpp, which I find weird that it's not in your include/ folder.

MyProject/App/CMakeLists.txt:

add_executable(App main.cpp src/foo.cpp src/bar.cpp src/baz.cpp)
target_include_directories(App PRIVATE include)
target_link_libraries(App PRIVATE Engine)

这只是为了让您开始。如果你想进行安装,那么你必须查看 install() ,我建议 the Mastering CMake chapter on installing things 。您可能还想看看 target_compile_features() , GenerateExportHeader.cmake SOVERSION VERSION 目标属性。

您可以像在任何其他平台上一样生成构建系统:cmake -S <path to source dir> -B <path to build dir> -G <name of visual studio generator you want (Ex. Visual Studio 17 2022)> <other args you want> 。请参阅the list of Visual Studio generators ,和the docs on running CMake to generate a project buildsystem 。生成的构建系统将有一个 Visual Studio 解决方案文件,您可以在 Visual Studio 中打开该文件。如果 CMake 配置发生更改,您将需要重新生成构建系统。 CMake 非常擅长检测这一点,并在运行构建时自动执行此操作。

要构建 CMake 目标(Visual Studio 项目),您可以使用 Visual Studio GUI(在那里查找构建项目的操作。在解决方案资源管理器中右键单击项目时,您可能会在上下文菜单中看到 ,以及顶部菜单中的一个,以及用于在顶部栏中构建当前选定项目的一个)。在 Visual Studio 之外,您可以使用 cmake --build <path to build dir> --target <name of target(s)> (参见docs for more info)。当你这样做时target_link_libraries ,CMake 注册了一个目标依赖项,因此生成的构建系统将知道在需要时重建您想要构建的目标的依赖项。

另请参阅my answer to "Most simple but complete CMake example"其中在中间部分附近用更长的篇幅解释了基础知识。

关于c++ - 如何使用 CMake 创建具有多个 Visual Studio 项目的 Visual Studio 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75841324/

相关文章:

android - 在 Android studio 中更改 cmake 目录

c++ - 指向 SDL 音频回调的成员函数的指针?

C++编译静态变量和共享对象

c++ - 试图从整个应用程序访问 QGLWidget

c# - 更改 MDI 窗体的背景

java - 尝试编译 Java 时出现未知的 CMake 命令 "add_jar"

c++ - 返回不准确的鼠标坐标

visual-studio - Visual Studio 2010 : Use hardware graphics acceleration if available

c# - 更改文本文件中特定行中的特定文本

c++ - CMake OpenCV 无法指定链接库