makefile
$@ 目标文件的完整名称
$* 不包含扩展名的目标文件名称
$^ 依赖文件列表(重复文件只取一次),以空格分开
$+ 依赖文件列表,以空格分开,可能包含重复的依赖文件
$< 第一个依赖文件的完整名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
makefile示例:
DEBUG = y
ifeq ($(DEBUG),y)
DEBFLAGS = -g -O
else
DEBFLAGS = -O2
endif
CFLAGS += $(DEBFLAGS)
CFLAGS += -Wall
bins: libs
g++ $(CFLAGS) main.cpp -o rps_server2 -L. -lrps_util -lrps_job -lplayer_info -lepoll -lrps_server /usr/lib/mysql/libmysqlclient.a #列出依赖的所有的第三方库(非系统的库),包括间接依赖的库
g++ $(CFLAGS) rps_test.cpp -o rps_test2 -L. -lrps_util -lplayer_info
g++ $(CFLAGS) rps_client.cpp -o rps_client2 -L. -lrps_util -lplayer_info
libs: class_epoll lib_rps_util class_player_info class_rps_job class_rps_server
class_epoll:
g++ $(CFLAGS) -fPIC -c epoll.cpp
ld -shared -soname libepoll.so -o libepoll.so epoll.o
lib_rps_util:
g++ $(CFLAGS) -fPIC -c rps_util.cpp
ld -shared -soname librps_util.so -o librps_util.so -lpthread rps_util.o #依赖于pthread库,系统库
class_player_info:
g++ $(CFLAGS) -fPIC -c player_info.cpp
ld -shared -soname libplayer_info.so -o libplayer_info.so player_info.o
class_rps_job: class_player_info #依赖于class_player_info
g++ $(CFLAGS) -fPIC -c rps_job.cpp
ld -shared -soname librps_job.so -o librps_job.so rps_job.o #注意这里并没有-lplayer_info
class_rps_server: class_epoll lib_rps_util class_player_info class_rps_job
g++ $(CFLAGS) -fPIC -I/usr/include/mysql -c rps_server.cpp
ld -shared -soname librps_server.so -o librps_server.so rps_server.o
clean:
rm -f *.o *.so* rps_server2 rps_client2 rps_test2