5

我有一个用于包含嵌入式单元测试的可执行 C++ 项目。我已将测试移至另一个 (.dll) 项目,以便将它们与 VS Test Runner 一起使用,除了一堆未解决的外部符号错误外,一切都很好。

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

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

4

2 回答 2

4

在检查 Microsoft.CppBuild.targets 后,我发现UseLibraryDependencyInputs设置为 true 的项目的 .obj 文件(对应于检查 VS 中的“使用库依赖输入”)仅在项目是 StaticLibrary 时才包含在内。

解决此问题的一种快速而肮脏的方法是覆盖ResolvedLinkObjs.vcxproj 中的任务,稍作修改。

对此进行测试,我能够链接我引用的项目中的所有 .obj 文件。

我将ItemNameMSBuildTargetOutputs任务输出的 更改为"ProjectReferenceToLink"并添加ConfigurationType=StaticLibrary到传递Propertie的 s. 将 .exe 项目视为在调用此目标时的副作用StaticLibrary并不是很明显,但我没有注意到任何不好的地方。

  <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。更简洁的方法也可能涉及不覆盖这样的内置目标,而是将其插入到链中。

于 2014-03-20T23:06:34.403 回答
-1

真的需要更多信息。

但我会尝试解决方案。

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

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

于 2014-03-20T04:41:40.830 回答