我理解的编译过程如下:
1)预处理:所有宏都会被替换为实际值,所有注释都会被删除等。将 #include 语句替换为所包含文件的文字内容。
2)编译:不深入探讨此过程,结果是针对特定架构的汇编文件。
3)汇编:将汇编文件转换为二进制指令即机器码。
4)链接:这就是我困惑的地方。在这一步中,你已经有了一个可执行文件。但如果你真正运行该可执行文件会发生什么?问题在于你可能已经包含了 *.h 文件,而这些文件只包含函数原型。因此,如果你从这些文件调用其中一个函数,它将没有定义并且你的程序将崩溃。
如果是这种情况,那么链接到底是做什么的呢?它是如何找到与所包含的 .h 文件相关联的 .c 文件,并将其注入到你的机器码中的?难道它不必再次经历整个编译过程吗?
现在,我已经了解到有两种类型的链接,动态链接和静态链接。静态链接是当你为每个可执行文件重新编译库源代码时发生的吗?我不太理解动态链接如何工作。所以你编译一个可执行库,所有使用它的进程都共享它?这究竟是如何实现的呢?它不会在试图访问它的进程的地址空间之外吗?此外,对于动态链接,你不仍然需要在某个时间点编译库吗?它只是一直在内存中等待使用吗?它是在何时编译的?
请你阅读上述内容并澄清所有误解、错误假设,并用正确的解释代替。
1)预处理:所有宏都会被替换为实际值,所有注释都会被删除等。将 #include 语句替换为所包含文件的文字内容。
2)编译:不深入探讨此过程,结果是针对特定架构的汇编文件。
3)汇编:将汇编文件转换为二进制指令即机器码。
4)链接:这就是我困惑的地方。在这一步中,你已经有了一个可执行文件。但如果你真正运行该可执行文件会发生什么?问题在于你可能已经包含了 *.h 文件,而这些文件只包含函数原型。因此,如果你从这些文件调用其中一个函数,它将没有定义并且你的程序将崩溃。
如果是这种情况,那么链接到底是做什么的呢?它是如何找到与所包含的 .h 文件相关联的 .c 文件,并将其注入到你的机器码中的?难道它不必再次经历整个编译过程吗?
现在,我已经了解到有两种类型的链接,动态链接和静态链接。静态链接是当你为每个可执行文件重新编译库源代码时发生的吗?我不太理解动态链接如何工作。所以你编译一个可执行库,所有使用它的进程都共享它?这究竟是如何实现的呢?它不会在试图访问它的进程的地址空间之外吗?此外,对于动态链接,你不仍然需要在某个时间点编译库吗?它只是一直在内存中等待使用吗?它是在何时编译的?
请你阅读上述内容并澄清所有误解、错误假设,并用正确的解释代替。