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

  • Post author:
  • Post category:其他

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




版权声明:本文为hjxu2016原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。