链接另一个项目中的所有.obj文件

时间:2013-09-12 01:08:29

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

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

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

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

2 个答案:

答案 0 :(得分:2)

在检查了Microsoft.CppBuild.targets后,我发现UseLibraryDependencyInputs设置为true的项目的.obj文件,对应于检查VS中的“使用库依赖项输入”,仅当项目是静态图书馆。

快速而肮脏的方法是覆盖.vcxproj中的任务ResolvedLinkObjs,稍作修改。

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

我将ItemName MSBuild任务输出的TargetOutputs更改为"ProjectReferenceToLink",并将ConfigurationType=StaticLibrary添加到已通过的Propertie。在调用此目标时将.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。一个更干净的方法也可能不会覆盖像这样的内置目标,而是将其插入到链中。

答案 1 :(得分:0)

真的需要更多信息。

但我会采取一种解决方案。

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

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