编译时是否可以链接并在此过程中省略独立的链接步骤?
编译时是否可以链接并在此过程中省略独立的链接步骤?
g++ mysource.cc
或cl mysource.cc
时,我会得到一个可执行文件。它们都使用多个不同的子进程来实现这一点,但我不确定这是否相关——即使你使用-c
调用g++,它至少也使用3个或更多的子进程。 - James Kanze#include <stdio.h>
int main( void )
{
printf( "Hello, world\n" );
return 0;
}
.file "hello.c"
.section .rodata
.LC0:
.string "Hello, world"
.text
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $.LC0, %edi
call puts
movl $0, %eax
leave
ret
puts
1,但是 puts
函数的机器码不是对象文件的一部分。puts
替换 printf
。
将编译和链接分开可以仅编译已更改的翻译单元。
这很好,因为它可以在大型项目上实现更快的构建,并减少关键项目的测试。
通常,编译阶段是最慢的。必须搜索文本并构建中间形式(对象文件)。
链接阶段更快,因为它在表格中查找符号并执行地址和符号解析。
通过不每次编译大型系统中的每个文件,可以节省时间。
此外,测试时间也会节省,因为一旦编译和测试了翻译单元,就可以将其保留下来。只有修改过的翻译单元需要重新测试。
一个例子是将数据文件编码为初始化数组。这些数据,例如字体位图,很少会更改。翻译单元只编译一次并保存为对象文件。这将我们的构建时间从5分钟缩短到1分钟。
简短回答:不可能。
即使您将所有代码放入单个翻译单元中,您的程序使用的库也需要链接。