11月05, 2018

makefile

编译安装过程, 0x01: 使用命令aclocal会生成m4文件,aclocal本质上是一个perl脚本。先提提m4, m4是一种宏处理器,它是 POSIX 标准的一部分。为什么叫m4呢,全称是macro,m后面有4个字母. 从图灵的角度来看 m4,输入流与输出流可以衔接起来构成一条无限延伸的纸带,m4 是这条纸带的读写头,所以 m4 是一种图灵机。 0x02:autoconf,是生成configure文件的,configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来 0x03 automake用来生成Makefile.in文件

o: 编译出来的目标文件
a: 静态库 (若干o文件打包)
so: 动态链接库(共享库)
lo: libtool编译出的目标文件,其实就是在o文件中添加了一些信息
la: libtool编译出的库文件,是个文本文件,记录同名动态库和静态库的相关信息,可以用如下命令查看.la文件的格式 $file.la
aclocal # 产生 aclocal.m4
autoconf # 根据 configure.in 生成configure
automake --add-missing # 根据 Makefile.am生成Makefile.in

alt

make 命令会找到当前目录的makefile来执行,依次查找 GNUmakefile makefile Makefile 一旦找到,开始读取这个文件并执行 也可以指定:make -f xiaolei.mk

make 命令执行后有三个退出码:

0 成功执行
1 运行时出现任何错误 返回1
2 使用了 make -q选项,使一些目标不需要更新

MAKECMDGOALS这个变量 存放指定的最终目标的列表。 ifneq是比较两个参数是否相同 all: 编译所有的目标 有很多路径和指令需要明确:

将file.c和tcp.c拷贝回你的home目录,也就是vote目录,修改Makefile为:

.SUFFIXES:.c
HOMEDIR=/xilinx/SamShare/APUE/vote
COMDIR=$(HOMEDIR)/comlib                      
INCDIRS=-I$(COMDIR)/include   /*  comlib.h放在此目录下  */
LIBDIRS=-L$(COMDIR)/lib    /*  file.c和tcp.c放在此目录下  */
LIB= -lcom
CC=gcc
CFLAGS=-O  -DUNIX  -DDEBUG  -DTRACE_FILE=‘“./trace”’  -D__PATH__='"$(PWD)/"'
AR=ar
ARFLAG=r
EDF=
file.o:file.c $(COMDIR)/include/comlib.h
    $(CC) -c file.c $(INCDIRS)
tcp.o:tcp.c $(COMDIR)/include/comlib.h
    $(CC) -c tcp.c $(INCDIRS)
lib: file.o tcp.o
    $(AR) $(ARFLAG) $(COMDIR)/lib/libcom.a file.o tcp.o    
.c:
    $(CC) -o [email protected] $< $(CFLAGS) $(INCDIRS) $(LIBDIRS) $(LIB)

这样,你需要用两个make来生成目标,先生成库文件 make lib再生成目标:make vote


gcc里面-L指定库的路径, -l连接库名 gcc 的 -I , 告訴 compiler 哪裡找 header file -Ldir, 去找 library 來連結.

很多子文件也需要一个makefile,用来生成xx.a库

lib目录是不认识.c文件的,一般是.a(库文件,静态库,实际上是一堆.o组合),或者.so(share object,动态库)。

程序编译用.h定位外部引用,ld时会链接这些库文件或者.o文件

cd /xilinx/SamShare/APUE/vote/comlib/lib
gcc -c file.c -I../include
gcc -c tcp.c -I../include
ar -r libcom.a file.o tcp.o

autoscan         # 根据路径下生成configure.scan 和 autoscan.log
aclocal         # 产生 aclocal.m4
autoconf         # 根据 configure.in 生成configure 
automake --add-missing     # 根据 Makefile.am生成Makefile.in

Autoconf实际上是一个工具集,其中包含aclocal、autoheader和autoconf等可执行文件。这些工具生成一个可移植的shell脚本—configure,configure和软件包一起发布给用户 configure脚本从一个称为 Makefile.in的模板文件生成每个Makefile文件。

Makefile.in 有Makefile.am 生成。

Configure.in 有开发者自己手动修改。

Makefile.am 是由开发者自己手写。


1) CROSSCOMPILE :=arm-linux
可以传递到底层Makefile文件的定义变量,也是个环境变量,选择export linux下的命令来全局化,按照进程的思想,当前Makefile层是一个进程,调用下一层Makefile的过程就是开启一个新的进程。调用下一个进程使用include + Makefile文件
2):= 这是个环境变量的定义
= 表示定义一个新的变量。**:=**表示是如果前边定义过了则选择是覆盖之前的定义, **+=**表示追加。**?=**则是表示如果询问定义,既是如果前边定义了,这里不在定义
3) arm-linux-gcc这里所说的是arm下交叉编译工具而gcc则是linux下的编译工具
4) CC以及LD这里定义的是编译器和链接器
5) -lm则是告诉编译器如果数学库找不到请到/libs下找。
数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找
6) -c 告诉编译器你编译的对象是.c
7) -o 告诉编译器编译无错后输出文件格式为.o
8) -static告诉编译器不用动态库,只是使用静态库(动态库和静态库的去一个是.so一个是.a
9) 使用动态库–share
10) -S生成汇编文件
11) -E生成预处理文件
12) -g 为在编译的时候,产生调试信息
13) -I指定头文件目录
14) $(PWD) 表示执行linux下命令 pwd 一个生成当前位置的变量
15) ALL: $(OBJS) 这里说明我们这就是编译的总目标
16) [email protected]  表示目标文件
17) $^  表示所有的依赖文件
18) $<  表示第一个依赖文件
19) $?  表示比目标还要新的依赖文件列表
20) wildcard : 扩展通配符
21) notdir : 去除路径
22) patsubst :替换通配符
23) SRC = $(wildcard *.c)
等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数
SRC = $(wildcard *.c) $(wildcard inc/*.c)
24) gcc -I -L -l的区别
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld
-l 第一优先寻找头文件目录
寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include
-L 第一优先寻找库文件目录
-lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)

可以查询自己想找的关键字! http://www.gnu.org/software/automake/manual/html_node/Program-and-Library-Variables.html http://www.gnu.org/software/automake/manual/html_node/index.html#SEC_Contents

过-I前缀指定头文件路径,特别说明./代表当前路径,../代表上一级目录 make clean && make gcc -Wall -std=gnu99 -I./test-add -I./test-sub -o test-sub/test-sub.o -c test-sub/test-sub.c gcc -o test test.o test-add/test-add.o test-sub/test-sub.o

1)makefile就是告诉shell如何正确自动化编译所有的文件。 2)那么我们需要搞清楚

先搞清楚

DUNIX -DDEBUG -DTRACE_FILE=‘“./trace”’ -DPATH='"$(PWD)/"' AR=ar ARFLAG=r EDF=

-I

references: http://blog.51cto.com/lee90/1969632

本文链接:https://harry.uno/post/makefile-1.html

-- EOF --

Comments