C语言编译之分部编译

发布时间 2023-07-03 19:33:30作者: TechNomad

一、概述

在C语言中,将源代码转换为可执行文件的过程通常涉及以下几个步骤:

  1. 编写源代码:使用文本编辑器创建C语言源代码文件,通常以.c为扩展名。

  2. 预处理:使用预处理器对源代码进行处理。预处理器指令以#开头,用于包含头文件、宏定义等。预处理器会根据指令进行文本替换和宏展开等操作,生成经过预处理的代码。预处理的输出通常以.为扩展名。

  3. 编译:将预处理后的代码编译成汇编代码。编译器将C代码翻译成汇编语言,生成汇编代码文件。汇编代码是与特定硬件平台相关的低级代码。编译的输出通常以.s为扩展名。

  4. 汇编:使用汇编器将汇编代码转换为机器码目标文件。汇编器会将汇编代码转化为机器指令,并生成目标文件(二进制文件)。目标文件是以二进制格式表示的机器码文件。

  5. 链接:将目标文件与所需的库文件进行链接,生成可执行文件。链接器会将目标文件与系统库和用户自定义库文件进行合并,解析函数和符号引用,生成最终的可执行文件。

二、预处理

命令示例:gcc -E source.c -o source.i

在C语言中,预处理是在编译之前对源代码进行处理的一个阶段。预处理器根据预处理指令(以#开头)对源代码进行处理,并生成经过宏展开和文本替换的代码。以下是C语言中常见的预处理指令和功能:

1.包含头文件:使用#include指令将其他文件中的内容包含到当前文件中。这样可以在代码中使用其他文件中定义的函数、常量和宏等。

#include <stdio.h>

2.宏定义:使用#define指令定义宏,将代码中的标识符替换为指定的文本。宏可以用于简化代码、定义常量或实现条件编译等。

#include <stdio.h>
#define PI 3.14159 #define MAX(a, b) ((a) > (b) ? (a) : (b))
int main() { printf("Hello World %lf,%d\n", PI, MAX(10, 20)); return 0; }

.i文件中替换为

int main() {
 printf("Hello World %lf,%d\n", 3.14159, ((10) > (20) ? (10) : (20)));
 return 0;
}

3.条件编译:使用条件编译指令(#if#ifdef#ifndef#elif#else#endif)根据条件选择性地编译代码块。这允许根据不同的条件编译不同的代码。

#include <stdio.h>

int main() {
#if 0
    printf("Debugging mode enabled\n");
#else
    printf("Debugging mode disabled\n");
#endif    
    return 0;
}

.i文件中替换为

int main() {
 printf("Debugging mode disabled\n");
 return 0;
}

4.预处理不会检查语法错误

#include <stdio.h>

int main() {
    printf("Hello World")    
    return 0;
}
int main() {
    printf("Hello World")
    return 0;
}

5.预定义宏:C语言中有一些预定义的宏,提供关于编译环境和代码的信息。例如,__FILE__表示当前文件名,__LINE__表示当前行号。

#include <stdio.h>

int main() {
    printf("File: %s, Line: %d\n", __FILE__, __LINE__);    
    return 0;
}

.i文件中替换为

int main() {
    printf("File: %s, Line: %d\n", "hello.c", 4);
   return 0;
}

6.预处理文件中会将源代码文件中的注释删除

#include <stdio.h>

int main() {
    //printf("File: %s, Line: %d\n", __FILE__, __LINE__);
   return 0;
}
int main() {
 return 0;
}

三、编译

示例命令:gcc -S source.i -o source.s

将预处理文件编译成汇编文件,另外也会检查语法错误

四、汇编

示例命令:gcc -c source.s -o source.o

将汇编文件编译成二进制文件.o

五、链接

示例命令:gcc source.o -o executable

将二进制文件链接成可执行文件