C程序
#include
int main(){
int x=1,y=1;
printf("x+y=%d",x+y);
}
将头文件引入进来、除去注释、宏定义下放
执行指令
g++ -E esc.c -o esc.i
将处理好的代码编译为汇编代码.s
执行指令
g++ -S esc.i -o esc.s
将编译好的.s文件转为机器码.o
执行指令
g++ -c esc.s -o esc
ld
)执行这一过程,解决了不同目标文件之间的符号引用关系,将它们连接在一起。执行指令
g++ esc.o -o esc
文件main.c
// main.c
#include
#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
解释
CC = g++
:
CC
,它指定了C++编译器的名称。在这个示例中,我们使用 g++
作为C++编译器。CFLAGS = -Wall -std=c++11
:
CFLAGS
,它包含了编译选项。-Wall
表示启用所有警告,-std=c++11
指定了C++11标准。SRC = main.cpp library.cpp
:
SRC
,包含了项目的所有源文件的名称。OBJS = $(SRC:.cpp=.o)
:
OBJS
,它是 SRC
中所有源文件的目标文件的列表。.cpp
文件扩展名被替换为 .o
文件扩展名。TARGET = main
:
TARGET
,表示最终的可执行程序的名称。all: $(TARGET)
:
all
是默认的目标。当你运行 make
命令时,它将构建 $(TARGET)
。$(TARGET): $(OBJS)
:
$(OBJS)
表示依赖于目标文件列表。规则中的命令 $(CC) $(CFLAGS) $^ -o $@
使用 g++
编译器编译目标文件,并将其链接为可执行程序。%.o: %.cpp
:
%.o
表示所有的目标文件,%.cpp
表示对应的源文件。规则中的命令 $(CC) $(CFLAGS) -c $< -o $@
编译每个源文件为对应的目标文件。clean
:
rm -f $(OBJS) $(TARGET)
删除目标文件和可执行程序。.PHONY: all clean
:
all
和 clean
是伪目标,不代表实际文件,因此不会检查它们的时间戳。这样可以确保 make
始终执行这两个目标,而不受文件时间戳的干扰。