【问题标题】:Good techniques to use Makefiles in VisualStudio?在 Visual Studio 中使用 Makefile 的好技巧?
【发布时间】:2009-02-27 07:56:48
【问题描述】:

我知道构建项目的理想方式是不需要基于 IDE 的项目文件,因为理论上它会导致各种自动化问题以及其他问题。但是我还没有在不依赖于 VisualStudio 项目的 Windows 上编译的项目上工作(好吧,显然一些开源的东西是用 Cygwin 完成的,但我在这里很笼统)。

另一方面,如果我们只是使用 VS 运行一个 makefile,我们会失去编译选项窗口的所有好处,并且维护外部 makefile 变得很痛苦。

那么使用 VS 的人实际上是如何处理外部 makefile 的呢?我还没有找到一个无痛的系统来做到这一点......

或者实际上大多数人不这样做,尽管它被宣传为良好的做法?

【问题讨论】:

    标签: visual-studio build-process makefile


    【解决方案1】:

    看看 MSBuild!

    • MSBuild 可以使用 VS 中的 sln/csproj 文件,因此对于简单的项目,您可以直接调用它们。
    • 如果您需要更多控制,请将项目封装在您自己的构建过程中,添加您自己的任务等 - 它非常可扩展!

    (我想添加一个示例,但这个编辑器完全搞砸了 XML……抱歉)

    【讨论】:

      【解决方案2】:

      理想情况下,实际上没有。

      Makefile 是我作为构建大师的首选,但是,开发人员将所有时间都花在了 Visual Studio IDE 中,当他们进行更改时,它是针对 vcproj 文件,而不是 makefile。因此,如果我使用 makefile 进行全局构建,那么它很容易与 8 或 10 个人正在使用的项目/解决方案文件不同步。

      我可以与整个团队保持同步的唯一方法是直接在我的构建过程脚本中对解决方案文件运行 devenv.exe。

      我的构建中很少有 makefile,它们位于预构建或自定义构建部分或单独的实用程序项目中。

      【讨论】:

      • 自定义构建一切有什么问题?它强制使 makefile 保持最新,不是吗?
      • 开发人员更喜欢 IDE,我不能强迫他们学习 Nmake。这将使所有的 makefile 维护工作都由我承担,我不会为他们做他们的工作。
      • 您不需要运行 devenv.exe。 Msbuild 是 .NET 框架的一部分。
      • msbuild 是 Visual Studio 用来运行构建的工具,msbuild 可以从命令行运行,无需打开 VS 或运行 devenv.exe。使用 VS 工具进行开发,使用命令行 msbuild 进行自动构建 - 相同的构建和相同的项目结构。
      【解决方案3】:

      一种可能性是使用CMake - 您使用脚本描述如何构建项目,CMake 会为您生成 Visual Studio 解决方案/项目文件。

      如果您需要从命令行或在持续集成工具中构建项目,您可以使用 CMake 为 NMake 生成 Makefile。

      如果您的项目是跨平台 - 您可以运行 CMake 为您选择的工具链生成 makefile。

      一个简单的 CMake 脚本如下所示:

      project(hello)
      add_executable(hello hello.cpp)
      

      将这两行与生成文件或在您喜欢的 IDE 中设置简单项目的方式进行比较。

      简而言之,CMake 不仅跨平台-启用您的项目,它还使其跨 IDE。如果您只想使用 eclipse 或 KDevelop 或代码块测试您的项目,只需运行 CMake 即可生成相应的项目文件。

      嗯,在实践中并不总是那么容易,但 CMake 的想法非常棒。

      例如,如果您考虑将 CMake 与 Visual Studio 一起使用,则需要进行一些调整才能获得熟悉的 VS 项目感觉,主要障碍是组织您的头文件和源文件,但这是可能的 - 检查 CMake wiki(并通过编写一个简短的脚本,您甚至可以简化此任务)。

      【讨论】:

        【解决方案4】:

        我们使用 NAnt 脚本,该脚本在编译步骤调用 MSBuild。使用 NAnt 允许我们执行构建前和构建后的任务,例如设置版本号以匹配源代码控制修订号、整理代码覆盖率信息、组装和压缩部署源。但是,它的核心仍然是 MSBuild 实际在进行编译。

        您可以将 NAnt 构建作为自定义工具集成到 IDE 中,以便在构建或持续集成服务器上以及开发人员以相同的方式使用它。

        【讨论】:

          【解决方案5】:

          就我个人而言,我使用Rake 在我的解决方案或项目上调用msbuild。对于常规开发,我使用 IDE 以及它提供的所有好处。

          Rake 的设置使我可以编译、编译和运行测试或编译运行测试并创建可部署的工件。

          一旦你有了构建脚本,就很容易开始做一些事情,比如设置持续集成并使用它来自动化部署。

          如果您follow these steps to set it up,您还可以在 IDE 中使用大多数构建工具。

          【讨论】:

          • Garry:我有一个关于同时使用 MsBuild 和 Rake 的问题。我很想得到你的答案!谢谢! stackoverflow.com/questions/679009/…
          • 老实说,这超出了我所做的任何事情,但我会密切关注这个问题,因为我很想知道你或其他人的想法。
          • 我们只是直接调用msbuild,这不是火箭科学。
          【解决方案6】:

          我们使用 devenv.exe(启动 IDE 的同一个 exe)从构建脚本(或命令行)构建我们的项目。指定 /Build 选项时,不会显示 IDE,所有内容都会写回控制台(如果指定 /Out 选项,则写回日志文件)

          更多信息请参见http://msdn.microsoft.com/en-us/library/xee0c8y7(VS.80).aspx

          例子:

          devenv.exe [solution-file-name] /Build [project-name] /Rebuild "Release|Win32" /Out solution.log

          其中“Release|Win32”是解决方案中定义的配置,solution.log 是获取编译器输出的文件(当您需要找出编译中出了什么问题时,这非常方便)

          【讨论】:

          • 实际上是 devenv.com 在控制台中显示结果。 devenv.exe 运行后立即返回并在后台执行构建过程。
          • 至少在 VS 2005 中是这样的。
          • 控制台构建最好使用msbuild,因为VS使用msbuild进行解决方案和项目编译
          • devenv.exe 对于诸如安装项目之类的东西是必需的,它没有与 msbuild 兼容的项目文件格式。对于在 cmd 行中使用 msbuild 的其他项目,效果更佳。
          【解决方案7】:

          我们有一个程序可以解析 vcproj 文件并从中生成 makefile 片段。 (这些包括文件列表和#defines,并且对自定义构建步骤的支持有限。)然后这些片段被包含在一个主 makefile 中,该文件执行通常的 GNU make 工作。

          (这都是针对我们的目标系统之一;它的工具没有对 Visual Studio 的原生支持。)

          这并不需要大量的工作。设置一天,然后总共可能一两天来解决一些不立即明显的问题。而且它工作得相当好:编译器设置由主 makefile 控制(不再摆弄那些小文本框),但任何人都可以以通常的方式添加新文件和定义到构建中。

          也就是说,Visual Studio 处理构建配置所固有的组合问题仍然存在。

          【讨论】:

            【解决方案8】:

            您为什么想要“在不依赖于 VisualStudio 项目的 Windows 上编译”的项目?您已经有一个解决方案文件 - 您可以将它与控制台构建一起使用。

            如果您的构建系统不像我们的那样复杂,我建议您将 msbuild 与 makefile、nant 甚至简单的批处理文件结合使用...

            我有什么遗漏吗?

            【讨论】:

            • 我们系统的十个组件和模块的完整构建大约需要 2 小时(仅限发布),并且在所有构建模式下还需要更多时间。加上 8 个系统需要在 unix 和其他几个编译器下编译。是的,这很复杂:)
            • 我们需要为 unix 和 windows 进行构建。为此,我们使用 msbuild、makefile 和 ant 的组合。而且还不错:) 也许您应该尝试优化构建过程——至少迭代构建速度。我们最近将构建时间从 35 分钟缩短到 7...
            • 我们有固态驱动器,因为链接和完整的程序优化占用了大约三分之一的时间。一直在研究其他优化,但还没有运气。无论如何,您的设置优于我们当前的设置,我们没有构建工程师。
            【解决方案9】:

            这段代码怎么样?

            public TRunner CleanOutput()
            {
                ScriptExecutionEnvironment.LogTaskStarted("Cleaning solution outputs");
            
                solution.ForEachProject(
                    delegate (VSProjectInfo projectInfo)
                        {             
                            string projectOutputPath = GetProjectOutputPath(projectInfo.ProjectName);
            
                            if (projectOutputPath == null)
                                return;
            
                            projectOutputPath = Path.Combine(projectInfo.ProjectDirectoryPath, projectOutputPath);
            
                            DeleteDirectory(projectOutputPath, false);
            
                            string projectObjPath = String.Format(
                                CultureInfo.InvariantCulture,
                                @"{0}\obj\{1}",
                                projectInfo.ProjectName,
                                buildConfiguration);
                            projectObjPath = Path.Combine(productRootDir, projectObjPath);
                            DeleteDirectory(projectObjPath, false);
                        });
            
                ScriptExecutionEnvironment.LogTaskFinished();
                return ReturnThisTRunner();
            }
            
            public TRunner CompileSolution()
            {
                ScriptExecutionEnvironment.LogTaskStarted ("Compiling the solution");
            
                ProgramRunner
                    .AddArgument(MakePathFromRootDir(productId) + ".sln")
                    .AddArgument("/p:Configuration={0}", buildConfiguration)
                    .AddArgument("/p:Platform=Any CPU")
                    .AddArgument("/consoleloggerparameters:NoSummary")
                    .Run(@"C:\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe");
            
                ScriptExecutionEnvironment.LogTaskFinished ();
                return ReturnThisTRunner ();
            }
            

            你可以在这里找到它的其余部分:http://code.google.com/p/projectpilot/source/browse/trunk/Flubu/Builds/BuildRunner.cs

            【讨论】:

              【解决方案10】:

              我自己还没有尝试过,但是微软有一个名为 NMake 的 Make 实现,它似乎有一个 Visual Studio 集成:

              【讨论】:

              • 不 - nmake 已经过时了,已经存在很多年了。它作为 .NET Framework sDK 和 Windows SDK 的一部分提供。但这不是 VS 用于构建的东西。 Visual Studio 使用 msbuild。这就是你应该研究的。
              【解决方案11】:

              自 VS2005 起,Visual Studio 使用“msbuild”来定义和运行构建。当您在 Visual Studio 设计器中摆弄项目设置时 - 假设您打开或关闭 XML 文档生成,或者添加新依赖项,或者添加新项目或程序集引用 - Visual Studio 将更新 .csproj(或 . vbproj 等)文件,这是一个 msbuild 文件。

              与之前的 Java ant 或 Nant 一样,msbuild 使用 XML 模式来描述项目和构建。当您进行“F6”构建时,它会从 VS 运行,您也可以从命令行运行它,而无需打开 VS 或运行 devenv.exe。

              因此,使用 VS 工具进行开发,使用命令行 msbuild 进行自动构建 - 相同的构建和相同的项目结构。

              【讨论】:

              • 几乎--Visual Studio 2005 和 2009 仅将 msbuild 用于 VB 和 C# 项目。 C 和 C++ 项目在这些版本中仍然使用旧的 vcproj 引擎。 VS2010 显然也切换到 MSBuild for C++。如果他说的是外部 makefile,那么他很可能正在构建 C 或 C++。
              猜你喜欢
              • 2010-09-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-17
              • 1970-01-01
              • 2023-03-19
              • 2015-11-30
              • 2011-02-06
              相关资源
              最近更新 更多