文章目录 一、了解gcc下生成,o和可执行文件二、%.o:%.c作用三、例子 一、了解gcc下生成,o和可执行文件 提高makefile,就不得不熟悉gcc命令 gcc编译的四个步骤,预处理->编译->汇编->链接成可执行文件 汇编就是生成.o文件,gcc下命令为 gcc -c test.s -o test.o #.s为编译出来的文件 gcc test.o -o test 或者直接 gcc -c test.c test.o gcc test.o -o test 也可以一步生成可执行文件 gcc test.c -o test 但是,如果成百上万个可执行文件,咋办,makefile提供了一个方法 二、%.o:%.c作用 网上称为静态模式规则,我们经常会看到这样的makefile文件 %.o:%.c $(CC) $(CFLAGS) $(LIBS) $(INC_DIRS) -o $@ -c $^ 前面提到过,makefile中语言为 目标: 依赖项 这里 %.o:%.c 指 所有的生成目标.o文件依赖与所有的.c文件, $@为目标 $^为所有的依赖 三、例子 工作作用,将头文件放在include文件夹,cpp文件放在source文件夹,test.cc为可执行文件 工程目录: . ├── include │ ├── myString.h │ └── utils.h ├── Makefile ├── source │ ├── myString.cpp │ └── utils.cpp └── test.cc 现在我们要对test.cc 生成一个可执行文件,然后每一个.cpp和.cc生成对应的.o汇编文件 makefile文件如下 TARGETBIN := topic_test CFLAGS := $(DEFINE_MACROS) CXXFLAGS := -std=c++11 #includes INC_DIRS := -I ./include #SRC_DIRS := ./test.cc SRC_DIRS += ./source/myString.cpp SRC_DIRS += ./source/utils.cpp #libs LIBS += -lstdc++ LIBS += -ldl -lpthread CXX_SOURCES = ./test.cc # 将OBJS赋值,找CXX_SOURCES 和 SRC_DIRS文件夹中的.cc和.cpp文件,给出对应名字的.o OBJS := $(patsubst %.cc, %.o, $(CXX_SOURCES)) OBJS += $(patsubst %.cpp, %.o, $(SRC_DIRS)) #tools CC = g++ #echo TARGET:$(OBJS) #compile 生成汇编文件.o %.o:%.c $(CC) $(CFLAGS) $(LIBS) $(INC_DIRS) -o $@ -c $^ %.o:%.cc $(CC) $(CFLAGS) $(CXXFLAGS) $(LIBS) $(INC_DIRS) -o $@ -c $^ %.o:%.cpp $(CC) $(CFLAGS) $(INC_DIRS) $(LIBS) -o $@ -c $^ #link 链接汇编文件 $(TARGETBIN): $(OBJS) $(CC) -o $(TARGETBIN) $^ $(INC_DIRS) $(CXXFLAGS) $(LIBS) #linl clean: $(info $(TARGETBIN)) $(info $(OBJS)) rm -rf $(TARGETBIN) $(OBJS)