社交广场

Makefile入门三、生成可执行文件且每个cpp对应一个.o文件

文章目录

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