一、了解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)