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

【LittleXi】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

// main.c
#include <stdio.h>
#include "library.h"

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

文件library.h

// library.h
#ifndef LIBRARY_H
#define LIBRARY_H

int add(int a, int b);

#endif

文件library.c

// library.c
#include "library.h"

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

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 始终执行这两个目标,而不受文件时间戳的干扰。

猜你喜欢

转载自blog.csdn.net/qq_68591679/article/details/134385537