我有一个用于包含嵌入式单元测试的可执行 C++ 项目。我已将测试移至另一个 (.dll) 项目,以便将它们与 VS Test Runner 一起使用,除了一堆未解决的外部符号错误外,一切都很好。
如果我将 .exe 中的所有 .obj 文件链接到 .dll 中,事情似乎会奏效,但是它们有很多,而且硬编码它们非常“脏”,因为列表总是可以改变的。
我尝试添加 .exe 项目作为参考并将“使用库依赖输入”设置为 True,但它似乎没有做任何事情。
我有一个用于包含嵌入式单元测试的可执行 C++ 项目。我已将测试移至另一个 (.dll) 项目,以便将它们与 VS Test Runner 一起使用,除了一堆未解决的外部符号错误外,一切都很好。
如果我将 .exe 中的所有 .obj 文件链接到 .dll 中,事情似乎会奏效,但是它们有很多,而且硬编码它们非常“脏”,因为列表总是可以改变的。
我尝试添加 .exe 项目作为参考并将“使用库依赖输入”设置为 True,但它似乎没有做任何事情。
在检查 Microsoft.CppBuild.targets 后,我发现UseLibraryDependencyInputs
设置为 true 的项目的 .obj 文件(对应于检查 VS 中的“使用库依赖输入”)仅在项目是 StaticLibrary 时才包含在内。
解决此问题的一种快速而肮脏的方法是覆盖ResolvedLinkObjs
.vcxproj 中的任务,稍作修改。
对此进行测试,我能够链接我引用的项目中的所有 .obj 文件。
我将ItemName
MSBuildTargetOutputs
任务输出的 更改为"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。更简洁的方法也可能涉及不覆盖这样的内置目标,而是将其插入到链中。
真的需要更多信息。
但我会尝试解决方案。
创建一个包含可执行文件和单元测试所需功能的库。
所以你最终得到了一个库和两个可执行文件,一个是你的产品,另一个是包含单元测试的可执行文件?