【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 始终执行这两个目标,而不受文件时间戳的干扰。
相关推荐
小莞尔13 小时前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔13 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
liujing1023292913 小时前
Day03_刷题niuke20250915
c语言
JCBP_14 小时前
QT(4)
开发语言·汇编·c++·qt·算法
第七序章16 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
l1t18 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
l1t20 小时前
利用美团龙猫用libxml2编写XML转CSV文件C程序
xml·c语言·libxml2·解析器
Gu_shiwww1 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
你怎么知道我是队长1 天前
C语言---循环结构
c语言·开发语言·算法
程序猿编码1 天前
基于 Linux 内核模块的字符设备 FIFO 驱动设计与实现解析(C/C++代码实现)
linux·c语言·c++·内核模块·fifo·字符设备