假设我有一堆C ++文件:A.cc,B.cc,C.cc及其相关的头文件。 A.cc使用B.cc中的类等。
现在说我要构建源文件。在预处理阶段之后,理论上我可以同时编译(不链接)所有文件吗? (A.cc - > A.obj,......)
我只是想知道是否曾经有一段时间我必须等到编译B.cc之前完成编译A.cc。
答案 0 :(得分:8)
不,除非你确实做了一些奇怪的事情,否则B.cc
的编译将取决于编译A.cc
的结果(反之亦然)。这就是为什么make -j
(并行运行多个“作业”,即进程,每个编译文件同时)是一种流行的用法,特别是当然在多核机器上(但不仅仅是那些,因为即使没有多个内核,最终的可能的少量同时作业比任意序列化的同一组作业完成得更快 - 一个可能被阻塞等待磁盘I / O而另一个是编辑CPU密集型部分... ... ...只要你有足够的可用物理RAM,那就是; - )。
答案 1 :(得分:0)
这就是标题的用途,对吧? make -j N会为你做这件事,虽然它基于易错的用户生成的Makefile。
答案 2 :(得分:0)
只有一种情况,您实际上需要这样的依赖:当一个文件生成稍后编译的C ++代码时。 Make足够灵活,可以支持这一点。但是当你想到你的常规项目时,不,你不想也不应该有这样的依赖。
答案 3 :(得分:-1)
文件末尾的扩展名或多或少毫无意义。重要的是你已经对你想要编译的所有类都有一个完整的定义,即使它们尚未实现。因为.h和.cc或.cpp扩展名是任意的,所以最重要的是文件的内容。
一般来说,如果您能够完全描述该类的对象,那么您将不会遇到问题。如果类定义在您设置的链中尚不存在(这可能发生在循环相关的标题中),那么您必须做一些魔术。
重点是,如果你遇到这个问题,它真的取决于你作为设计师/开发者