当前位置: 首页>移动开发>正文

makefile 添加opencv库 makefile .c=.o

  Makefile带来直接好处就是——“自动化编译”。一旦写好,只需要一个make命令,整个工程完全自动编译,所以十分方便。而Makefile文件就是告诉make命令怎么样地去编译和链接程序。但是想要比较灵活的运用它,还是先要熟悉一些关于系统对程序编译和链接的知识。 

1.一个简单的makefile例子

假设一个程序有两个文件file1.c,file2.c,每个文件都包含head.h,生成file可执行文件

file:file1.o file2.o       附属行(文件的依存关系)
    gcc -o file1.o file2.o    命令行
file1.o:file1.c head.h
    gcc -c file1.c
file2.o:file2.c head.h
    gcc -c file2.c

从file最终的目标文件开始倒推,依次列出文件的依存关系,make在执行时:

(1)判断file可执行文件是否存在,若不存在,则执行命令行,向下寻找依存关系

(2)若file存在,则检查依靠文件,是否存在更新,若存在更新则执行命令行,若没有更新则给出提示:

make:'file' is up to date.

2.makefile中的宏定义及内部变量

宏定义:

OBJS = file1.o file2.o
CC = gcc
CFLAGS = -wall -O -g

引用:

file:$(OBJS)
    $(CC) $(OBJS) -o file
file1.o:file1.c head.h
    $(CC) $(FLAGS) -c file1.c
file2.o:file2.c head.h
    $(CC) $(FLAGS) -c file2.c

内部变量: 

$^  代表所有的依赖文件

$@  代表所有的目标文件 

$

file:$(OBJS)
    $(CC) $^ -o $@
file1.o:file1.c head.h
    $(CC) $(FLAGS) -c $< -o $@
file2.o:file2.c head.h
    $(CC) $(FLAGS) -c $< -o $@

"$(CC) $(FLAGS) -c $< -o $@"是隐含规则,可以不写,默认使用此规则ww

3.假象

 假设一个项目要生成两个可执行文件file1和file2,这两个文件是独立的,则在makefile开始处:

all:file1 file2

make总是假设all要生成,去检查它的依赖文件

4.清除由make产生的文件

clean:
    rm *.o
    rm file

执行:

make clean

则会清除由make生成的*.o和file文件

如果有clean文件存在,则清除不会执行(因clean没有可依赖的文件,永远是最新的)

 使用PHONY目标,避免同名文件相冲突,不会检查clean文件存在与否,都要执行清除操作

.PHONY : clean
clean:
    rm *.o   
     rm file

5.makefile函数

搜索当前目录,生成由*.c结尾的文件列表,wildcard--函数名

SOURCE = $(wildcard *.c)

用%.o替换$(SOURCE)中的%.c文件

OBJS = $(patsubst %.c,%.o,$(SOURCE))

6.产生新规则

SOURCE = $(wildcard *.c)
depends:$(SOURCE)
    gcc -M $(SOURCE) > depends

(为每一个.c文件产生规则,c文件和相关头文件为依靠)

makefile文件中:

include depends

7.一个有效的makefile文件 

        可以完成大部分我们所需要的依靠检查,不用做太多的修改就可用在大多数项目里

功能:搜索当前目录,寻找源码文件,放入SOURCE变量里,利用patsubst产生目标文件(*.o)

CC = gcc
CFLAGS = -Wall -O -g
 
SOURCE = $(wildcard *.c,*.cc)
OBJS = $(patsubst %.c,%.o,$(patsubst,%.cc,%.o,$(SOURCE)))
 
file:$(OBJS)
    $(CC) $^ -o $@

用默认规则产生目标文件(*.o)

(缺点:并未包含头文件,当头文件更新时,不能重新编译)


https://www.xamrdz.com/mobile/4mw1961441.html

相关文章: