Visual c++ Visual Studio 2012是否可以执行自定义生成,例如:编译项目a>;编制并链接项目B>;链接项目A?

Visual c++ Visual Studio 2012是否可以执行自定义生成,例如:编译项目a>;编制并链接项目B>;链接项目A?,visual-c++,visual-studio-2012,msbuild,build-process,Visual C++,Visual Studio 2012,Msbuild,Build Process,我正在寻找一种使用Visual Studio 2012按此顺序构建项目的方法(C++但可能是一个一般性问题): 编译ProjectA(我只需要.objs) 编译并链接ProjectB 链接项目A 我不能简单地在ProjectB中使用ProjectA的引用/依赖项,因为它会过早地执行ProjectA的链接 我曾经用VS 2008这样做: 项目B上的预生成事件:vcbuild/pass0/pass1ProjectA 编译并链接ProjectB(它是ProjectA的依赖项) 编译(实际上什么都

我正在寻找一种使用Visual Studio 2012按此顺序构建项目的方法(C++但可能是一个一般性问题):

  • 编译ProjectA(我只需要.objs)
  • 编译并链接ProjectB
  • 链接项目A
我不能简单地在ProjectB中使用ProjectA的引用/依赖项,因为它会过早地执行ProjectA的链接

我曾经用VS 2008这样做:

  • 项目B上的预生成事件:
    vcbuild/pass0/pass1
    ProjectA
  • 编译并链接ProjectB(它是ProjectA的依赖项)
  • 编译(实际上什么都不做,因为它已经构建)并链接ProjectA
但vcbuild已从VS 2012中消失,我将命令替换为:

msbuild/t:BuildGenerateSources/t:BuildCompile

这里的问题是,在第三步中,它应该只链接(因为msbuild已经编译),现在它再次编译ProjectA,然后链接它。使用msbuild启用诊断详细性向我展示了以下情况:由于自上次生成以来命令行中的更改,强制重新生成所有源文件。。而且几乎没有人(包括)有解决方案,因为不可能看到这两个命令正在进行比较

直接使用VisualStudio(没有在命令行中启动msbuild的预构建事件)执行我想要的操作的另一个好处是将编译错误报告到错误列表,并在输出窗口中单击

也许在幕后,这将使用msbuild和vcxprojs中指定的目标,但我想知道它是否可行

编辑:我已经尝试用devenv替换调用msbuild的命令,但是devenv没有可以指定compile only(无链接)的开关,因此也不能使用它


Edit2:听起来好像有人在这里问了类似的问题(没有解决方案)

好的,因此可以通过覆盖.vcxproj中的构建步骤并删除目标构建链接来完成

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
      <BuildSteps Condition="'$(BuildSteps)' == '' or '$(SkipLink)'!='false'">
            ResolveReferences;
            PrepareForBuild;
            InitializeBuildStatus;
            BuildGenerateSources;
            BuildCompile;
            <!-- BuildLink; -->
      </BuildSteps>
</PropertyGroup>

请注意,BuildSteps覆盖中添加了一个条件SkipLink,以便我们可以指定何时执行BuildLink,何时不执行。

我很好奇为什么需要执行此操作,因为我需要ProjectA(一个DLL)的objs为ProjectB(一个DLL)创建一个.def文件创建导入库。为什么不让ProjectA的后期生成活动生成自己的.def文件作为输出,以便在需要时可用,而不是让依赖项目代表其生成输出?
msbuild /t:BuildLink /p:VisualStudioVersion=11.0 /p:Configuration=Debug /p:Platform=x64 /p:SkipLink=false "ProjectA.vcxproj"