一、makfile基本符号说明
$^:所有的依赖文件
$@:目标文件
$<:第一个依赖文件
如下是可直接使用的makefile,注释已说明相关注意事项,按需修改即可
CC := gcc
# 头文件设置
VPATH := ../../include:\
../../a/b/c: \
../u/d:
CPPFLAGES := $(patsubst %:, -I%, $(VPATH))
# 动态库设置
LDFLAGS := -L../path \
-L/path/ab -lpthread -ltest \
-Lku_ana \
-Wl,-rpath,../../path/log # 注意-Wl与rpath间无空格,最好用export定义LD_LIBRARY_PATH指定动态库路径
# 编译选项 其中-fvisibility=hidden隐藏符号增加反编译难度, 公开的接口可加__attribute__ ((visibility ("default")))属性,如#define EXPORT_API __attribute__ ((visibility ("default")))
CFLAGS := -g -Wall -O0 -fvisibility=hidden
# 生成目标文件和*.o到指定目录,使源文件目录更清爽
SRCDIR:= /a/b
DESTDIR := /ab/c
SRCFILES := $(wildcard $(SRCDIR)/*.c)
#OBJFILES := $(SRCFILES:.c=.o) # *.o与*.c在同一目录可使用此方式,效果与$(patsubst %.c, %.o, $(SRCFILES))相同
OBJFILES:= $(patsubst $(SRCDIR)/%.c, $(DESTDIR)/%.o, $(SRCFILES))
TARGET := app
# 生成.o和目标到DESTDIR中
$(TARGET) : $(OBJFILES)
$(CC) -o $(DESTDIR)/$@ $^ $(CFLAGS) $(LDFLAGS)
$(DESTDIR)%.o : $(SRCDIR)/%.c
$(CC) -c $< -o $@ $(CFLAGS) $(CPPFLAGS)
.PHONY: clean
clean:
-test -d $(DESTDIR) || mkdir -p $(DESTDIR)
-rm -rf $(TARGET) $(OBJFILES)
.PHONY: install
install:
-mv $(SRCDIR)/*.h /A/N
二、手动连接的库
- -lz:手动链接压缩库libz
- -lrt:手动链接实时库librt。这个库包括异步I / O,消息队列,进程调度,实时信号扩展,信号量,共享内存对象,同步I / O和定时器选项下定义的接口。
- -lm:手动链接数学库libm,libm库是Linux系统中的一种数学库文件,它提供了各种数学函数,例如三角函数、指数函数、对数函数以及一些高级数学函数等等。
- -lc:手动链接标准c库libc,libc库是Linux系统中最基础的库文件,它包含了各种C语言库函数以及一些系统级的API。这个库文件提供了Linux系统中最常用的函数,例如字符串操作、IO操作、数学函数等等,也是其他库文件的基础。
- -lpthread:手动链接多线程库pthread,用到多线程需要链接,包括在linux上使用std::thread也需要链接。libpthread库是Linux系统中的线程库文件,它提供了各种线程相关的API函数。使用这个库可以在Linux系统中创建多线程程序,实现程序并发执行,提高程序运行效率。
- -lcrypt:手动链接加密库libcrypt。libcrypt库是Linux系统中的一个加密库文件,可以提供各种加密算法,例如DES、SHA等等。使用这个库可以实现对数据的加密和解密,保证数据的安全性。