0%

CppMakefile

linux下c++编程,makefile编写方式。

简单makefile文件示例

1
2
3
4
5
6
7
8
9
10
11
helloworld:file1.o file2.o
g++ file1.o file2.o -o helloworld

file2.o:file2.cpp
g++ -c file2.cpp -o file2.o

file1.o:file1.cpp
g++ -c file1.cpp -o file1.o

clean:
rm -rf *.o helloworld

规则:

1
2
3
A: B
<command>
<command>
冒号表示依赖关系。写好makefile文件后,之间键入make命令,就会执行内容了。

变量使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
OBJS = file1.o file2.o
XX = g++
CFLAGS = -Wall -O -g

hellowordl : $(OBJS)
$(XX) $(OBJS) -o helloworld

file2.o : file2.cpp file1.h
$(XX) $(CFLAGS) --c file2.cpp -o file2.o

file1.o : file1.cpp file1.h
$(XX) $(CFLAGS) --c file1.cpp -o file2.o

clean:
rm -rf *.o helloworld

函数使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CC = gee
XX = g++
CFLAGS = -Wall -O -g
TARGET = helloworld

%.o : %.c
$(CC) $(CFLAGS) -e $< - o $@

%.o : %.cpp
$(XX) $(CFLAGS) -e $< -o $@

SOURCES = $(wildeard *.c *.cpp)
OBJS = $(patsubst %.c,%.o , $(patsubst %.cpp,%.o, $(SOURCES)))

$(TARGET) : $(OBJS)
$(XX) $(OBJS) -o $(TARGET)

clean :
rm -rf * .o helloworld
  • 第7行中,$<拓展成依靠列表中的第一个依靠文件,$^拓展成依靠列表中所有文件(去除重复),$@拓展成当前规则的目的文件名。
  • 在 makefile 规则中,通配符会被自动展开 。 但在变量的定义和函数引用时,通配符将失效。
  • $(wildcard *.c *.cpp)函数,展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
  • $(patsubst %.c,%.o,$(dir))函数三个参数,第一个是一个需要匹配的式样,第二个参数表示用什么来替换,第三个是需要处理的由空格分隔的列表。