【问题标题】:Using CMake to generate Visual Studio C++ project files使用 CMake 生成 Visual Studio C++ 项目文件
【发布时间】:2010-09-28 13:16:10
【问题描述】:

我正在开发一个开源 C++ 项目,用于在 Linux 和 Windows 上编译的代码。我使用 CMake 在 Linux 上构建代码。为了便于开发设置和政治原因,我必须坚持使用 Windows 上的 Visual Studio 项目文件/编辑器(例如,我无法切换到 Code::Blocks)。我看到了使用 CMake 生成 Visual Studio 文件的说明,如 here

您之前是否使用过 CMake 生成 Visual Studio 文件?你的经历如何?假设我想在我的项目中添加一个新文件。这个工作流程是什么?

【问题讨论】:

  • 对于那些在 GNU+Linux 中尝试为特定于 Windows 的 Visual Studio 生成项目文件的用户,请记住 this answerTL;DR: 生成器是特定于平台的,您必须在 Windows 中执行此操作。

标签: c++ visual-studio build-process cross-platform cmake


【解决方案1】:

CMake 实际上对此非常有用。关键部分是 Windows 端的每个人都必须记住在加载解决方案之前运行 CMake,而我们 Mac 端的每个人都必须记住在 make 之前运行它。

作为 Windows 开发人员,最困难的部分是确保您的结构更改在 cmakelist.txt 文件中,而不是在解决方案或项目文件中,因为这些更改可能会丢失,即使没有丢失也不会转移到Mac 方面也需要它们,Mac 人员需要记住不要出于同样的原因修改 make 文件。

这只是需要一点思考和耐心,但一开始会有错误。但是如果你在两边都使用continuous integration,那么这些会很早就被淘汰,人们最终会养成习惯。

【讨论】:

  • 如果这曾经是真的,那么它不再是了。对 CMakeLists.txt 的任何更改都将导致构建系统(Visual Studio 的项目文件、makefile 等)的重新生成。 Visual Studio 中的工作流程有点烦人,因为 Visual Studio 在检测到事情发生变化时不会重新生成项目文件,而是等待您进行构建,这会导致出现一个对话框,因为需要中止构建以重新-加载项目文件。
  • 需要注意的是,您不必通过 IDE 运行 Visual Studio 编译器。您可以在命令行上运行它:C:\...> MSBuild ALL_BUILD.vcxproj
  • @PfunnyGuy 另见cmake --build .
  • @detly 谢谢!我实际上发现了,并使用cmake --build . --config Debug -- /nologo /verbosity:minimal /m。我将在. target run_tests 之后插入以运行我的googletest 单元测试,并且可以将“调试”替换为“发布”。 (为 Debug 添加 config 选项是可选的,因为它是默认设置,但我包含它是为了展示如何将其与“Release”交换)
【解决方案2】:

不确定它是否与问题直接相关,但我一直在寻找如何从 cmake 项目生成 *.sln 的答案,我发现可以使用这样的东西:

cmake -G "Visual Studio 10"

该示例从输入的 CMakeLists.txt 文件生成所需的 VS 2010 文件

【讨论】:

【解决方案3】:

我们将部门的构建链移至 CMake,但由于其他部门使用我们的项目文件并且习惯于将它们导入到他们的解决方案中,因此我们遇到了一些内部障碍。我们还抱怨 CMake 没有完全集成到 Visual Studio 项目/解决方案管理器中,因此必须手动将文件添加到 CMakeLists.txt;这是人们习惯的工作流程的重大突破。

但总的来说,这是一个非常平稳的过渡。我们很高兴,因为我们不再需要处理项目文件了。

将新文件添加到项目的具体工作流程非常简单:

  1. 创建文件,确保它在正确的位置。
  2. 将文件添加到 CMakeLists.txt。
  3. 构建。

如果任何 CMakeLists.txt 文件发生更改,CMake 2.6 会自动重新运行(并且(半)自动重新加载解决方案/项目)。

请记住,如果您在进行源外构建,则需要注意不要在构建目录中创建源文件(因为 Visual Studio 只知道构建目录)。

【讨论】:

    【解决方案4】:

    CMake 无缝生成 Visual Studio 项目和解决方案。您甚至可以为不同的 Visual Studio 版本生成项目/解决方案,而无需对 CMake 文件进行任何更改。

    添加和删除源文件只需修改具有源文件列表的CMakeLists.txt 并重新生成项目/解决方案。甚至还有一个 globbing 函数可以查找目录中的所有源代码(但应谨慎使用)。

    以下链接很好地解释了 CMake 和 Visual Studio 的特定行为。

    CMake and Visual Studio

    【讨论】:

    • 该链接及其示例项目非常非常有用,谢谢!我建议将github repo 中的一些源代码合并到您的答案中,例如提到 CMake 项目等同于解决方案,并且 add_executable 之类的东西用于添加相当于 Visual Studio 项目.
    【解决方案5】:

    正如亚历克斯所说,它运作良好。唯一棘手的部分是记住在 cmake 文件中进行任何更改,而不是在 Visual Studio 中进行更改。因此,在所有平台上,工作流程都类似于您使用普通的旧 makefile。

    但它相当容易使用,而且我没有遇到 cmake 生成无效文件或类似问题的问题,所以我不会太担心。

    【讨论】:

      【解决方案6】:

      CMake 可以生成非常好的 Visual Studio .projs/.slns,但总是存在需要修改 .cmake 文件而不是 .proj/.sln 的问题。就像现在一样,我们正在处理它:

      1. 所有源文件都转到/src,Visual Studio 中可见的文件只是.filter 中定义的“链接”。
      2. 程序员添加/删除文件,记住在定义的/src 目录下工作,而不是默认项目的目录。
      3. 完成后,他运行一个脚本来“刷新”各个 .cmake 文件。
      4. 他检查代码是否可以在重新创建的环境中构建。
      5. 他提交了代码。

      起初我们有点担心结果会怎样,但工作流程运行良好,每次提交前都可以看到很好的差异,每个人都可以轻松查看他的更改是否正确映射到 .cmake 文件中。

      要了解的另一件重要的事情是 CMake 中的“解决方案配置”缺乏支持 (afaik)。就目前而言,您必须生成带有项目/解决方案的 两个 目录 - 每个构建类型(调试、发布等)一个。没有直接支持更复杂的功能 - 换句话说:在配置之间切换不会给您预期的结果。

      【讨论】:

      • 从 CMake 2.8.10 开始,生成的解决方案具有 4 种自定义构建配置,并且支持定义其他自定义配置。
      【解决方案7】:

      这里有很多很棒的答案,但它们可能会被 CMake support in Visual Studio (Oct 5 2016) 取代

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-13
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多