我有一个可执行的C ++项目,用于包含嵌入式单元测试。我已经将测试移动到另一个(.dll)项目,将它们与VS Test Runner一起使用,除了一堆未解决的外部符号错误外,一切都很顺利。
如果我将.exe中的所有.obj文件链接到.dll中,似乎工作正常,但是它们中有很多并且硬编码它们非常“脏”,因为列表总是可以更改。
我尝试添加.exe项目作为参考并将“使用库依赖项输入”设置为True,但它似乎没有做任何事情。
答案 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)
真的需要更多信息。
但我会采取一种解决方案。
创建一个包含可执行文件和单元测试所需功能的库。
所以你最终得到了一个库和两个可执行文件,一个是你的产品,另一个是包含单元测试的可执行文件?