如何在MSVC 2015中编译链接自定义工具生成的源文件?
解决MSVC 2015中自定义生成文件的编译链接问题
当然可以实现!你完全能让第三方工具生成的foo1.c和foo2.c自动沿用项目的编译器、链接器选项,并且无缝融入整个编译链接流程。下面是具体的步骤和细节:
核心思路
因为你已经把foo.smth的项类型设为Custom Build Tool,接下来只需要通过配置让MSVC追踪生成的.c文件,并自动将它们纳入编译链——关键是让MSVC知道foo.smth的输出产物,以及这些产物需要被编译。
步骤1:配置Custom Build Tool的输出与依赖
首先完善foo.smth的自定义构建工具设置,确保MSVC能正确触发生成并追踪产物:
- 右键点击项目中的
foo.smth→ 属性 - 切换到Custom Build Tool → General标签页:
- Command Line:填入你的第三方工具命令,注意用MSVC宏来避免硬编码路径,比如:
(如果路径含空格,一定要用引号包裹)thirdpartytool.exe "$(InputPath)" "$(ProjectDir)temp\intermediate\foo1.c" "$(ProjectDir)temp\intermediate\foo2.c" - Outputs:必须明确填写生成的两个文件路径,这是让MSVC自动追踪依赖的关键:
$(ProjectDir)temp\intermediate\foo1.c;$(ProjectDir)temp\intermediate\foo2.c - Additional Dependencies(可选):如果
foo.smth依赖其他文件(比如配置文件),可以在这里添加,确保这些文件更新时会重新生成.c文件
- Command Line:填入你的第三方工具命令,注意用MSVC宏来避免硬编码路径,比如:
- 点击应用保存设置
步骤2:让生成的.c文件自动纳入编译流程
MSVC不会自动把Custom Build Tool生成的文件加入编译,所以需要手动将它们添加到项目中(即使文件暂时不存在):
- 在解决方案资源管理器中,右键项目 → 添加 → 现有项
- 导航到
temp\intermediate目录,选中foo1.c和foo2.c(如果文件还没生成,直接输入文件名手动添加也可以) - 分别右键这两个
.c文件 → 属性:- 确保Item Type设置为C/C++ Compiler(默认就是这个,除非被修改过)
- 在General标签页,将Excluded From Build设为否
- (可选)如果需要明确依赖关系,在Build Events → Custom Build Step的Dependencies中添加
foo.smth,确保MSVC先生成.c文件再编译
步骤3:验证编译器/链接器选项继承
因为这两个.c文件是项目的正式成员,它们会自动继承项目级的所有C/C++编译选项(比如优化级别、预处理器定义、包含目录等),链接时也会自动加入到最终的二进制文件中,完全不需要额外配置。如果需要给这两个文件单独设置特殊选项,直接在它们的属性页修改即可(会覆盖项目级设置)。
额外注意事项
- 如果
temp\intermediate目录不存在,建议在项目的预构建事件中添加创建目录的命令,避免工具报错:if not exist "$(ProjectDir)temp\intermediate" mkdir "$(ProjectDir)temp\intermediate" - 所有路径尽量使用MSVC内置宏(比如
$(SolutionDir)、$(ProjectDir)、$(InputPath)),保证项目在不同环境下的可移植性 - 可以通过清理解决方案后重新构建,观察输出窗口的日志,确认流程顺序:先运行第三方工具生成
.c文件,再编译这两个文件,最后完成链接
内容的提问来源于stack exchange,提问作者Alex Aparin
相关产品推荐
相关产品推荐

