如何将生成的C文件的obj添加到MSBuild项目的链接器中?
解决MSBuild仅链接时添加生成OBJ文件的问题
以下是几个可行的方案,帮你把生成的C文件对应的OBJ纳入链接流程:
1. 直接指定链接器的额外依赖项
直接在项目文件中给链接器的AdditionalDependencies属性添加目标OBJ文件路径,注意用MSBuild内置属性引用中间目录(比如$(IntDir),对应默认的Debug/或Release/子目录),避免硬编码路径:
<PropertyGroup> <!-- 追加OBJ到现有依赖,保留原有设置 --> <LinkAdditionalDependencies>$(LinkAdditionalDependencies);$(IntDir)your_generated_file.obj</LinkAdditionalDependencies> </PropertyGroup> <ItemDefinitionGroup> <Link> <AdditionalDependencies>$(LinkAdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup>
执行仅链接命令时,用msbuild /t:Link即可,前提是目标OBJ文件已经存在。
2. 使用LinkLibraryDependency项
MSBuild的LinkLibraryDependency项会自动被链接器识别为输入文件,直接添加生成的OBJ到这个项即可:
<ItemGroup> <LinkLibraryDependency Include="$(IntDir)your_generated_file.obj" /> </ItemGroup>
如果OBJ是通过自定义目标生成的,可指定该项的生成时机,确保在链接前被处理:
<ItemGroup> <LinkLibraryDependency Include="$(IntDir)your_generated_file.obj" BeforeTargets="Link" /> </ItemGroup>
3. 确保生成的C文件被正确编译
如果你的生成C文件还没被编译为OBJ,先把它加入ClCompile项,让MSBuild自动编译并追踪OBJ:
<ItemGroup> <ClCompile Include="path/to/your_generated_file.c" /> </ItemGroup>
之后执行msbuild /t:Link时,MSBuild会检查OBJ是否存在,若不存在会自动触发编译(如果之前没编译过)。如果只想纯链接,确保先执行过编译命令(比如msbuild /t:ClCompile)。
4. 修正链接目标的依赖关系
如果生成C文件的自定义目标和链接目标没有关联,可手动让Link目标依赖生成/编译步骤,确保仅链接时也能保证OBJ就绪:
<!-- 自定义生成C文件的目标 --> <Target Name="GenerateMySourceFile" BeforeTargets="ClCompile"> <Exec Command="your_generator_tool.exe -o your_generated_file.c" /> <ItemGroup> <ClCompile Include="your_generated_file.c" /> </ItemGroup> </Target> <!-- 确保链接前完成生成和编译 --> <Target Name="EnsureGeneratedFilesReady" BeforeTargets="Link" DependsOnTargets="GenerateMySourceFile;ClCompile" />
内容的提问来源于stack exchange,提问作者Daniel Guggolz
相关产品推荐
相关产品推荐

