2

假设我有一堆 C++ 文件:A.cc、B.cc、C.cc 以及它们相关的头文件。A.cc 使用 B.cc 中的类等等。

现在说我要构建源文件。在预处理阶段之后,理论上我可以同时编译(而不是链接)所有文件吗?(A.cc -> A.obj, ...)

我只是想知道是否有一段时间我必须等到我完成 A.cc 编译后再编译 B.cc。

4

4 回答 4

8

不,除非您确实在做一些奇怪的事情,否则编译B.cc取决于编译的结果A.cc(反之亦然)。这就是为什么make -j(并行运行多个“作业”,即进程,每个同时编译一个文件)是一种流行的用法,当然尤其是在多核机器上(但不仅仅是那些,因为即使没有多核少量同时的作业最终可能比任意序列化的同一组作业更快地完成——一个可能会被阻塞等待磁盘 I/O,而另一个正在搅动编译的 CPU 密集型部分......) . 只要你有足够的可用物理内存,那就是;-)。

于 2010-09-21T00:46:05.980 回答
0

这就是标题的用途,对吧?make -j N 会为您执行此操作,尽管它基于易出错的用户生成的 Makefile 执行此操作。

于 2010-09-21T00:46:20.910 回答
0

只有一种情况您真正需要这种依赖:当一个文件生成稍后编译的 C++ 代码时。Make 足够灵活来支持这一点。但是当你想到你的常规项目时,不,你不想要也不应该有这样的依赖。

于 2010-09-21T01:23:11.860 回答
-1

文件末尾的扩展名或多或少毫无意义。重要的是你已经对你试图编译的所有类都有一个完整的定义,即使它们还没有实现。因为 .h 和 .cc 或 .cpp 扩展名是任意的,所以最重要的是文件的内容。

一般来说,如果你能够完整地描述类的一个对象,那么你就不会遇到问题。如果您设置的链中尚不存在类定义(循环依赖的标头可能会发生这种情况),那么您必须做一些魔术。

关键是,如果你遇到这个问题,这真的取决于你作为设计者/开发者

于 2010-09-21T00:49:16.953 回答