【问题标题】:Link all .obj files from another project链接来自另一个项目的所有 .obj 文件
【发布时间】:2013-09-12 01:08:28
【问题描述】:

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

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

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

【问题讨论】:

  • 那么现在你有两个前任了?
  • 你不能用所有这些 obj 文件创建一个库并添加这个库的链接依赖项吗?我认为这就是它的完成方式

标签: visual-studio visual-studio-2012 visual-c++ msbuild


【解决方案1】:

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

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

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

我将TargetOutputs MSBuild 任务输出的ItemName 更改为"ProjectReferenceToLink",并将ConfigurationType=StaticLibrary 添加到传递的Properties。在调用此目标时将 .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。更简洁的方法也可能涉及不覆盖这样的内置目标,而是将其插入到链中。

【讨论】:

    【解决方案2】:

    确实需要更多信息。

    但我会尝试解决方案。

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

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

    【讨论】:

    • 感谢您的尝试,但这是我自己一开始就试图避免的明显解决方案。与硬编码 .obj 文件进行链接相比,它的工作量更大,风险也更大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2012-12-25
    相关资源
    最近更新 更多