【发布时间】:2013-03-13 22:55:37
【问题描述】:
我正在寻找一种使用 Visual Studio 2012(C++,但可能是一个普遍问题)按此顺序构建项目的方法:
- 编译 ProjectA(我只需要 .objs)
- 编译和链接ProjectB
- 链接项目A
我不能简单地在 ProjectB 中使用 ProjectA 的引用/依赖,因为它会过早执行 ProjectA 的链接。
我曾经在 VS 2008 中这样做过:
- ProjectB 上的 PreBuild 事件:
vcbuild /pass0 /pass1ProjectA - 编译链接ProjectB(ProjectA的依赖)
- 编译(实际上什么都不做,因为它已经构建好了)并链接 ProjectA
但是 vcbuild 从 VS 2012 中消失了,我将命令替换为:
msbuild /t:BuildGenerateSources /t:BuildCompile
这里的问题是,在第三步它应该只链接(因为 msbuild 已经编译)它现在 再次编译 ProjectA 然后链接它。使用 msbuild 启用诊断冗长向我展示了这一点:由于自上次构建以来命令行中的更改而强制重建所有源文件。。而且几乎没有人(包括Visual Studio 2010 randomly says the command line changed, and rebuilds)对此有解决方案,因为无法查看正在比较的两个命令。
直接使用 Visual Studio(没有在命令行中启动 msbuild 的预构建事件)执行我正在寻找的另一个好处是将编译错误报告到错误列表并在输出窗口中单击。
也许在后台这将使用 vcxprojs 中指定的 msbuild 和 Targets,但我想知道它是否可行。
编辑:我已经尝试用 devenv 替换调用 msbuild 的命令,但是 devenv 没有可以指定仅编译(无链接)的开关,因此也不能使用。
Edit2:听起来好像有人在这里问过类似的问题(没有解决方案)Is it possible for Visual Studio C++ to compile objects without linking
【问题讨论】:
-
我很好奇你为什么需要这样做
-
因为我需要 ProjectA(它是一个 DLL)的 objs 来为 ProjectB(它是一个 DLL)创建一个 .def 文件来创建一个导入库。
-
为什么不让 ProjectA 的构建后活动生成自己的 .def 文件作为输出,以便在需要时可用,而不是让依赖项目在其上生成输出代表?
标签: visual-c++ visual-studio-2012 msbuild build-process