g++ 在哪里存储编译的源代码?

g++ 在哪里存储编译的源代码?

我使用 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.cfoo.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最常见的是二进制文件作为参数。

相关内容