使用CMake生成Visual Studio C ++项目文件


91

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

您以前使用过CMake生成Visual Studio文件吗?您的经历如何?假设我要向项目添加一个新文件。这是什么工作流程?


1
对于那些尝试为Windows特定的Visual Studio生成项目文件的GNU + Linux用户,请记住这个答案TL; DR:生成器是特定于平台的,您必须在Windows中才能这样做。
–'code_dredd

Answers:


57

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

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

只是需要一点思考和耐心,但是起初会有错误。但是,如果双方都在使用持续集成,那么这些将尽早消除,最终人们会养成这种习惯。


11
如果曾经是真的,那就不再是。对CMakeLists.txt的任何更改都会导致重新生成构建系统(Visual Studio的项目文件,makefile等)。Visual Studio中的工作流有点烦人,因为当Visual Studio在检测到情况已更改时不会重新生成项目文件,而是等待您进行构建,这会导致出现对话框,因为需要中止构建才能重新生成-加载项目文件。
维塔利

1
需要注意的是,您不必通过IDE运行Visual Studio编译器。您可以在命令行上运行它:C:\...> MSBuild ALL_BUILD.vcxproj
PfunnyGuy

2
@PfunnyGuy另请参阅cmake --build .
熟练地

@detly谢谢!我实际上发现了,并使用cmake --build . --config Debug -- /nologo /verbosity:minimal /m。我将在之后插入. target run_tests以运行googletest单元测试,然后将“调试”替换为“发布”。(为Debug添加config选项是可选的,因为它是默认选项,但我将其包括在内以说明如何与“ Release”互换)
PfunnyGuy

47

不知道它是否与问题直接相关,但是我一直在寻找有关如何从cmake项目中生成* .sln的答案,我发现一个人可以使用如下代码:

cmake -G "Visual Studio 10"

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


1
@ stackoverflow.com / questions / 11269833 /…@Ivan指出,可以将其放入PreLoad.cmake文件中,该文件与顶级CMakeLists.txt放在同一文件夹中,然后就可以这样做cmake
PfunnyGuy

25

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

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

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

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

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

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


9

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

但这很容易使用,而且cmake生成无效文件或类似的东西也没有问题,因此我不必担心太多。


7

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

添加和删​​除源文件只需要修改CMakeLists.txt具有源文件列表的文件并重新生成项目/解决方案即可。甚至还有一个遍历功能来查找目录中的所有源(尽管应谨慎使用)。

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

CMake和Visual Studio


该链接及其示例项目非常非常有用,谢谢!我建议将github存储库中的某些源代码合并到您的答案中,例如,提及CMake项目等同于解决方案,并使用诸如add_executable之类的内容添加与Visual Studio项目等同的内容。
jrh

5

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

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

最初,我们有点担心结果如何,但是工作流确实运行良好,并且在每次提交之前都可以看到很好的差异,每个人都可以轻松查看自己的更改是否正确映射到 .cmake文件中。

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


4
从CMake 2.8.10开始,生成的解决方案具有4种常规构建配置,并且支持定义其他自定义构建配置。
约翰


0

我已经启动了自己的项目,名为syncProj。文档/下载链接从这里:

https://docs.google.com/document/d/1C1YrbFUVpTBXajbtrC62aXru2om6dy5rClyknBj5zHU/edit# https://sourceforge.net/projects/syncproj/

如果您打算使用Visual Studio进行开发,并且目前仅支持C ++。

与其他make系统相比,主要优点是您可以实际调试脚本,因为它基于C#。

如果您不熟悉syncProj,则可以将解决方案/项目转换为.cs脚本,并从那时起继续进行进一步的开发。

在cmake中,您将需要从头开始编写所有内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.