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


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

    C程序

    #include 
    
    int main(){
        int x=1,y=1;
        printf("x+y=%d",x+y);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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

    // main.c
    #include 
    #include "library.h"
    
    int main() {
        int result = add(3, 5);
        printf("Result: %d\n", result);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    文件library.h

    // library.h
    #ifndef LIBRARY_H
    #define LIBRARY_H
    
    int add(int a, int b);
    
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    文件library.c

    // library.c
    #include "library.h"
    
    int add(int a, int b) {
        return a + b;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    解释

    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 始终执行这两个目标,而不受文件时间戳的干扰。
  • 相关阅读:
    C++:优先级队列模拟实现和仿函数的概念使用
    C++中extern的使用
    Java栈和队列的实现
    java枚举类
    利用QRCode.js生成动态二维码页面
    深度学习的模型压缩与加速(万字长文带你入门)
    MySQL数据库实现主从复制,docker实现版
    小程序中的事件处理
    CF385D Bear and Floodlight
    无涯教程-Android Mock Test函数
  • 原文地址:https://blog.csdn.net/qq_68591679/article/details/134385537