gpt4 book ai didi

c++ - 使用 visual studio 创建一个 cmake 项目

转载 作者:可可西里 更新时间:2023-11-01 17:37:48 26 4
gpt4 key购买 nike

Visual Studio 2017 为处理 CMake 项目提供内置支持。 The documentation主要涵盖基于预先存在的 cmake 项目的场景。但是是否支持创建 cmake 项目而无需摆弄 CMakeLists.txt 文件?

最佳答案

编辑:VS2017 15.6 添加了官方新项目 CMake 向导

version 15.6出现了“从添加新项目对话框创建 CMake 项目”的功能。

enter image description here

这创建了一个简单的 基于 C++“Hello CMake”项目。

自定义 CMake 向导

您的问题和现有向导的缺乏激发了我编写一个向导的灵感。这是一个非常基本的设置,如果在编写 Visual Studio 扩展方面有更多经验的人愿意贡献,那肯定会受益,但这里是:

https://github.com/FloriansGit/VSCMakeWizards

编辑:最新的 VSIX 安装程序现在也可以在 VS 市场上免费获得

https://marketplace.visualstudio.com/items?itemName=oOFlorianOo.CMakeProjectWizards

新的“CMake 可执行模板”将在您的 Visual Studio 2017 重新启动后出现在“文件/新建/项目/Visual C++”下:

CMake Project Wizard

它在给定的文件夹中生成以下文件,然后在其上使用“打开文件夹”:

CMakeLists.txt
CMakeSettings.json
MyProject1.cpp

后续步骤

可能的后续步骤是:

  • 为一些基本项目/编译器设置添加交互式向导对话框
  • 还添加一个项目向导,以便能够将源文件添加到 CMakeLists.txt

我期待收到有关基本想法的反馈。请将任何请求直接添加到:

https://github.com/FloriansGit/VSCMakeWizards/issues

代码

这里是威世智的基本/初始代码作为引用:

WizardImplementationClass.cs

// Based on https://learn.microsoft.com/en-us/visualstudio/extensibility/how-to-use-wizards-with-project-templates
// and https://stackoverflow.com/questions/3882764/issue-with-visual-studio-template-directory-creation

using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using EnvDTE;
using Microsoft.VisualStudio.TemplateWizard;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using EnvDTE80;

namespace VSCMakeWizards
{
public class WizardImplementation : IWizard
{
public void RunStarted(object automationObject,
Dictionary<string, string> replacementsDictionary,
WizardRunKind runKind, object[] customParams)
{
var destinationDir = replacementsDictionary["$destinationdirectory$"];
var desiredNamespace = replacementsDictionary["$safeprojectname$"];
var templatePath = Path.GetDirectoryName((string)customParams[0]);

var dte = automationObject as DTE2;
var solution = dte.Solution as EnvDTE100.Solution4;

if (solution.IsOpen)
{
solution.Close();
}

File.Copy(Path.Combine(templatePath, "CMakeSettings.json"), Path.Combine(destinationDir, "CMakeSettings.json"));
File.Copy(Path.Combine(templatePath, "main.cpp"), Path.Combine(destinationDir, desiredNamespace + ".cpp"));

// see https://stackoverflow.com/questions/1231768/c-sharp-string-replace-with-dictionary
Regex re = new Regex(@"(\$\w+\$)", RegexOptions.Compiled);
string input = File.ReadAllText(Path.Combine(templatePath, "CMakeLists.txt"));
string output = re.Replace(input, match => replacementsDictionary[match.Groups[1].Value]);

File.WriteAllText(Path.Combine(destinationDir, "CMakeLists.txt"), output);

var vsSolution = Package.GetGlobalService(typeof(SVsSolution)) as IVsSolution7;

if (vsSolution != null)
{
vsSolution.OpenFolder(destinationDir);
}

throw new WizardCancelledException();
}

// This method is called before opening any item that
// has the OpenInEditor attribute.
public void BeforeOpeningFile(ProjectItem projectItem)
{
}

public void ProjectFinishedGenerating(Project project)
{
}

// This method is only called for item templates,
// not for project templates.
public void ProjectItemFinishedGenerating(ProjectItem
projectItem)
{
}

// This method is called after the project is created.
public void RunFinished()
{
}

// This method is only called for item templates,
// not for project templates.
public bool ShouldAddProjectItem(string filePath)
{
return false;
}
}
}

注意:WizardCancelledException 是必需的,否则 Visual Studio 会尝试生成/打开实际解决方案。尚不支持“打开文件夹”类型的项目向导(没有用于此的 SDK API)。

引用资料

关于c++ - 使用 visual studio 创建一个 cmake 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46741850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com