由于项目需要,在网上随便看了一下后,记录一下我对目前掌握的makefile理解。
gcc -o a a.c
我们上面,命令行为原型对makefile编译进行深入讲解。上面命令行可以拓展为下面的makefile:
CC=gcc #如果非环境变量,需要指明路径;例如:CC=/home/croos/bin/gcc
CFLAGS = -Wall #输出make时的所有警告
DEFINE = #这里加入的宏,在文件代码中可以直接引用
INCLUDE = -I.
TARGET = filename #要生成的最终目标,如:可执行程序
SUORCES += $(wildcard *.c) #要编译的目标文件,wildcaed匹配当前目录下所有的.c文件加入
OBJS = $(patsubst %.c,%.o,$(SOURCES))
LIBS += -l1 -l2 ... #一般的,-l1 -l2 这是链接库的规则 即lib1.a或者lib1.so,链接时则写成-l1这
#样的
All:$(OBJS)
$(CC) -o $(PROGRAM) $(OBJS) $(LIBS) #链接所有文件
%.o:%.c
$(CC) -c $(CFLAGS_WARN) $(DEFINE) $(INCLUDE) $< -o $@
clean:
rm -f $(OBJS)
rm -f $(TARGET)
这样可以引入第三方库。
总的来说就是在基本的目标命令行之后加入要链接的库。如下:
gcc a a.c -l1 #-l1为编译a.c为a文件时所需要的库
通用模板
CC=/home/ubuntu/workzt/arrch64-linux-gnu/bin/aarch64-linux-gnu-g++
CFLAGS = -Wall -O2 -std=c++11
DEFINE =
INCLUDE = -I./include
target = SaveStream
src = $(wildcard *.cpp)
objs = $(patsubst %.cpp,%.o,$(src))
libs = -L/home/ubuntu/workzt/ffmpegTomp4/aarch64_lib/ -lavformat -lavcodec -lavfilter -lswscale -lavutil -lswresample -lavdevice -lm -pthread
All:$(target)
$(target):$(objs)
$(CC) $^ -o $@ $(libs)
%.o:%.cpp
$(CC) $(CFLAGS) $(DEFINE) $(INCLUDE) -c $< -o $@
clean:
rm -f $(objs)
rm -f $(target)