Visual studio 链接其他项目中的所有.obj文件 我有一个可执行的C++项目,用于包含嵌入的单元测试。我已经将测试转移到另一个(.dll)项目,以便与VS测试运行程序一起使用,除了一系列未解决的外部符号错误外,一切都很好

Visual studio 链接其他项目中的所有.obj文件 我有一个可执行的C++项目,用于包含嵌入的单元测试。我已经将测试转移到另一个(.dll)项目,以便与VS测试运行程序一起使用,除了一系列未解决的外部符号错误外,一切都很好,visual-studio,visual-studio-2012,visual-c++,msbuild,Visual Studio,Visual Studio 2012,Visual C++,Msbuild,如果我将所有.obj文件从.exe链接到.dll中,事情似乎都会成功,但是有很多文件,而且硬编码非常“脏”,因为列表总是可以更改的 我尝试将.exe项目添加为引用,并将“使用库依赖项输入”设置为True,但似乎没有任何作用。确实需要更多信息 但我会尝试一个解决方案 创建一个包含可执行文件和单元测试所需功能的库 因此,您最终得到了一个库和两个可执行文件,一个是您的产品,另一个是包含单元测试的可执行文件?在检查Microsoft.CppBuild.targets时,我发现,UseLibraryDep

如果我将所有.obj文件从.exe链接到.dll中,事情似乎都会成功,但是有很多文件,而且硬编码非常“脏”,因为列表总是可以更改的


我尝试将.exe项目添加为引用,并将“使用库依赖项输入”设置为True,但似乎没有任何作用。

确实需要更多信息

但我会尝试一个解决方案

创建一个包含可执行文件和单元测试所需功能的库


因此,您最终得到了一个库和两个可执行文件,一个是您的产品,另一个是包含单元测试的可执行文件?

在检查Microsoft.CppBuild.targets时,我发现,
UseLibraryDependencyInputs
设置为true的项目的.obj文件对应于在VS中选中“使用库依赖项输入”,仅当项目是静态库时才包括

解决这个问题的一种快速而肮脏的方法是重写.vcxproj中的任务
ResolvedLinkObjs
,只需稍加修改

通过测试,我能够链接我引用的项目中的所有.obj文件

我将
targetOutput
MSBuild任务输出的
ItemName
更改为
“ProjectReferenceToLink”
,并将
ConfigurationType=StaticLibrary
添加到传递的
属性中。调用此目标时将.exe项目视为
静态库
的副作用并不明显,但我没有注意到任何不好的地方

  <Target Name="ResolvedLinkObjs" DependsOnTargets="$(CommonBuildOnlyTargets)">
    <MSBuild Projects="@(_MSBuildProjectReferenceExistent)"
             Targets="GetResolvedLinkObjs"
             BuildInParallel="$(BuildInParallel)"
             Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform); ConfigurationType=StaticLibrary"
             Condition="'%(_MSBuildProjectReferenceExistent.Extension)' == '.vcxproj' and '@(ProjectReferenceWithConfiguration)' != '' and '@(_MSBuildProjectReferenceExistent)' != ''"
             ContinueOnError="!$(BuildingProject)"
             RemoveProperties="%(_MSBuildProjectReferenceExistent.GlobalPropertiesToRemove)">
      <Output TaskParameter="TargetOutputs" ItemName="ProjectReferenceToLink" />
    </MSBuild>
  </Target>


这很容易修改,只需从一个项目中获取.objs。更干净的方法可能还包括不覆盖像这样的内置目标,而是将其插入到链中。

那么现在您有两个EXE?您不能用所有这些obj文件创建一个库并添加到该库的链接依赖项吗?我想这就是它拒绝尝试的原因,但这是我自己一开始试图避免的显而易见的解决方案。这比硬编码.obj文件链接要复杂得多,风险也要大得多。