如何使用CMake创建包含多个Visual Studio项目的Visual Studio解决方案?

4uqofj5v  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(443)

我想在Windows中使用Visual Studio(我使用的特定版本是2022)创建一个项目,我以前从未在Windows中使用过CMake,所以我只是遵循Visual Studio对我说的话。
我想有一个项目结构,我有一个应用程序目录,生成一个可执行文件,一个引擎文件夹,生成一个dll共享库。
我想单独运行它们,所以当我完成Engine并按下run时,我只想让项目生成dll文件,而不对App目录执行任何操作。
然后,当我运行应用程序时,我希望它生成一个依赖于引擎创建的dll的exe,而不是重新生成引擎目录。
我希望它们位于同一个解上,如下所示:

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项目时,它会创建一个解决方案,我可以右键单击该解决方案,比如add project并进行相应的配置,但当我创建一个cmake项目时,它只会给我一个文件夹,当我右键单击它时,没有add project

它不一定是一个解决方案,只要我在同一个视图中实现了两个独立的构建我很好。就可以了。
现在的问题是,据我所知,visual studio在项目的根目录下放置了一个CMakeLists.txt文件,当我按下build时,它会运行。现在,当我手动添加文件夹时,我的项目结构如下所示:

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

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

w8f9ii69

w8f9ii691#

CMakeLists.txt文件不是“按下build时运行”。它是一个配置文件。它用于配置CMake(“教”CMake如何)生成特定类型的构建系统构建系统的配置与调用构建系统来执行构建是分开的。只需像在任何平台上一样为项目编写一个CMakeLists.txt文件即可。(你的前几句话似乎暗示你已经在其他平台上使用过它)。你可以为windows做一些特殊的事情,但我认为这里没有特别的需要。你有两个CMake目标,它们会变成两个VS项目。一旦你生成了VS buildsystem(解决方案文件),就像你在VS GUI中一样构建每个项目。
现在,考虑到您的文件布局,您可能需要以下内容:
我的项目/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,以及SOVERSIONVERSION目标属性。
生成buildsystem就像在任何其他平台上一样: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>。请参阅Visual Studio生成器列表,以及有关运行CMake生成项目生成系统的文档。生成的生成系统将包含一个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)>(更多信息请参阅文档)。当你使用target_link_libraries时,CMake会注册一个目标依赖项,因此生成的buildsystem将知道在需要时重建你想要构建的目标的依赖项。
另请参阅my answer to "Most simple but complete CMake example",它更详细地解释了中间部分附近的基础知识。

相关问题