我使用 Makefile 和 g++ 编译了一个应用程序,结果发现,当我修改 Makefile(我更改为动态链接库的路径)时,g++ 不必再次重新编译整个应用程序。当时应用程序还没有成功编译,因此没有最终的可执行应用程序可用。但 g++ 没有再次编译整个应用程序。
这些信息或编译源存储在哪里?我没有在 /tmp 中看到任何内容,也没有在我的主目录中的任何隐藏文件中看到任何内容,也没有在应用程序本身的根目录中看到任何内容。 (也许我看起来不够好)。
答案1
GCC 将其生成的内容存储在您(或在本例中为 Makefile)告诉它的任何位置(使用-o
输出选项)。它本身不进行编译结果缓存。
使部分重新编译成为可能的是 Makefile 本身。它是一组目标(可执行文件、目标文件,可能还有其他东西)以及它们所依赖的内容以及从这些依赖项生成目标的规则。
make
通过评估依赖关系链来查看需要构建的所有内容,并重建所有尚不存在的目标或具有比目标更新的依赖关系的目标。
例如,假设您有这个简单的 Makefile:
foo.o: foo.c foo.h
gcc -o foo.o -c foo.c
foo: foo.o
gcc -o foo foo.o
如果您调用make foo
,它将查看 Makefile,看看它foo
依赖于foo.o
。所以它向上查找foo.o
,发现这取决于foo.c
和foo.h
。如果foo.o
这两个文件中的任何一个文件较旧,或者如果foo.o
不存在,则执行编译行gcc -o foo.o -c foo.c
,生成foo.o
.
如果您make foo
在那之后重新运行,foo.o
将比 C 文件和标头更新,因此make
不会重新编译foo.o
,并跳到链接最终的可执行文件(如果有必要 - 它可能只是说不需要执行任何操作) 。
答案2
当 Makefile 构建一些源代码时,请查看各个g++
命令。该-o
选项显示部分编译的输出的存储位置。
确保查看 C++ 源代码的编译。 g++ 的最后一次调用可能是链接步骤,然后-o
最常见的是二进制文件作为参数。