【LittleXi】C程序预处理、编译、汇编、链接步骤

【LittleXi】C程序预处理、编译、汇编、链接步骤

C程序

c 复制代码
#include<stdio.h> 

int main(){
    int x=1,y=1;
    printf("x+y=%d",x+y);
}

1、预处理

将头文件引入进来、除去注释、宏定义下放

执行指令

g++ -E esc.c -o esc.i

2、编译

将处理好的代码编译为汇编代码.s

执行指令

g++ -S esc.i -o esc.s

3、汇编

将编译好的.s文件转为机器码.o

执行指令

g++ -c esc.s -o esc

4、链接

  • 链接是将多个目标文件和库文件组合成最终的可执行文件的过程。
  • 链接器(如GNU链接器,通常称为ld)执行这一过程,解决了不同目标文件之间的符号引用关系,将它们连接在一起。
  • 主要任务包括解析符号引用、符号解析、符号重定位、生成可执行文件。
  • 如果使用了外部库(如标准C库),链接器还会将所需的库文件与程序一起链接,以满足程序的依赖性。

执行指令

g++ esc.o -o esc

5、补充,也可以自己写Makefile文件,示例如下

文件main.c

c 复制代码
// main.c
#include <stdio.h>
#include "library.h"

int main() {
    int result = add(3, 5);
    printf("Result: %d\n", result);
    return 0;
}

文件library.h

c 复制代码
// library.h
#ifndef LIBRARY_H
#define LIBRARY_H

int add(int a, int b);

#endif

文件library.c

c 复制代码
// library.c
#include "library.h"

int add(int a, int b) {
    return a + b;
}

Makefile文件

makefile 复制代码
CC = g++
CFLAGS = -Wall -std=c++11
SRC = main.cpp library.cpp
OBJS = $(SRC:.cpp=.o)
TARGET = main

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) $^ -o $@

%.o: %.cpp
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	rm -f $(OBJS) $(TARGET)

.PHONY: all clean

解释

  1. CC = g++
    • 这一行定义了一个Makefile变量 CC,它指定了C++编译器的名称。在这个示例中,我们使用 g++ 作为C++编译器。
  2. CFLAGS = -Wall -std=c++11
    • 这一行定义了一个Makefile变量 CFLAGS,它包含了编译选项。-Wall 表示启用所有警告,-std=c++11 指定了C++11标准。
  3. SRC = main.cpp library.cpp
    • 这一行定义了一个Makefile变量 SRC,包含了项目的所有源文件的名称。
  4. OBJS = $(SRC:.cpp=.o)
    • 这一行定义了一个Makefile变量 OBJS,它是 SRC 中所有源文件的目标文件的列表。.cpp 文件扩展名被替换为 .o 文件扩展名。
  5. TARGET = main
    • 这一行定义了一个Makefile变量 TARGET,表示最终的可执行程序的名称。
  6. all: $(TARGET)
    • 这是一个Makefile规则,表示 all 是默认的目标。当你运行 make 命令时,它将构建 $(TARGET)
  7. $(TARGET): $(OBJS)
    • 这是一个Makefile规则,定义了如何从目标文件构建可执行程序。$(OBJS) 表示依赖于目标文件列表。规则中的命令 $(CC) $(CFLAGS) $^ -o $@ 使用 g++ 编译器编译目标文件,并将其链接为可执行程序。
  8. %.o: %.cpp
    • 这是一个Makefile规则,定义了如何将每个源文件编译成对应的目标文件。%.o 表示所有的目标文件,%.cpp 表示对应的源文件。规则中的命令 $(CC) $(CFLAGS) -c $< -o $@ 编译每个源文件为对应的目标文件。
  9. clean
    • 这是一个Makefile规则,用于清理生成的目标文件和可执行程序。命令 rm -f $(OBJS) $(TARGET) 删除目标文件和可执行程序。
  10. .PHONY: all clean
    • 这一行告诉Make工具,allclean 是伪目标,不代表实际文件,因此不会检查它们的时间戳。这样可以确保 make 始终执行这两个目标,而不受文件时间戳的干扰。
相关推荐
杨福瑞35 分钟前
C语言⽂件操作讲解(总)
c语言·开发语言
润 下3 小时前
C语言——深入解析C语言指针:从基础到实践从入门到精通(三)
c语言·开发语言·经验分享·笔记·学习·程序人生·其他
润 下3 小时前
C语言——深入解析C语言指针:从基础到实践从入门到精通(二)
c语言·开发语言·经验分享·笔记·学习·程序人生
say_fall4 小时前
精通C语言(4.四种动态内存有关函数)
c语言·开发语言
小秋学嵌入式-不读研版4 小时前
C65-枚举类型
c语言·开发语言·笔记
FreeBuf_5 小时前
Happy DOM曝CVSS 9.4严重RCE漏洞,PoC已公开(CVE-2025-61927)
java·c语言·c++·python·php
无限进步_5 小时前
【C语言】杨辉三角:数学之美与编程实现的完美结合
c语言·开发语言
明天会有多晴朗6 小时前
C语言入门教程(第6讲):函数——让程序学会“分工合作”的魔法
c语言·开发语言·算法
yanqiaofanhua7 小时前
C语言自学--编译和链接
c语言·开发语言
R&ain7 小时前
文件指针和普通指针的区别
c语言·指针