Linxu程序构建-Makefile

Makefile程序编译控制,表明程序应该如何构造,通过多个输入来生成输出文件时,手册页的编写以及将应用程序安装到目标目录,都可以使用Makefile

makefile语法:

文件由一组依赖关系和规则构成,每个依赖由一个目标(将要创建的文件)和一组该目标所依赖的源文件组成。

make命令的选项和参数:

-k 让make命令在发现错误时仍然继续执行,而不是检测到第一个错误时就停止

-n 让make输出将要执行的操作步骤,而不真正执行这些操作

-f <filename> 告诉系统哪个文件时Makefile文件,否则将首先搜索makefile,不存在则搜索Makefile(建议使用)

 

 

#Makefile myapp.1是myapp的说明文件 在makefile中生成 all: … 生成所有需要的目标

all: myapp myapp.1

 

 

如果不指定all,则makefile只会创建在Makefile中找到的第一个目标

宏: 定义与引用,一般用于替换可能改变的,多出出现的字符串 如编译器(gcc cc c89)之间的切换 debug版本与release版本之间的切换

   

MACRONAME=value "MACRONAME = value" (在外部调用makefile给定宏定义时,有空格,需要用引号)

${MACRONAME} $(MACRONAME) $MACRONAME 三种,推荐前两种

例子:

all: myapp
# Which compiler
CC = gcc
# Where to install
INSTDIR = /usr/local/bin
# Where are include files kept
INCLUDE = .
# Options for development
CFLAGS = -g -Wall -ansi
# Options for release
# CFLAGS = -O -Wall -ansi

myapp: main.o 2.o 3.o
    $(CC) -o myapp main.o 2.o 3.o
main.o: main.c a.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.o: 2.c a.h b.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
    $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

clean:
    -rm main.o 2.o 3.o # -rm 可以排除删除不存在文件导致的错误警告 -f 也可以 按理说 -f更好用

install: myapp
    @if [ -d $(INSTDIR) ]; \
    then \
        cp myapp $(INSTDIR);\
        chmod a+x $(INSTDIR)/myapp;\
        chmod og-w $(INSTDIR)/myapp;\
        echo "Installed in $(INSTDIR)";\
    else \
        echo "Sorry, $(INSTDIR) does not exist";\
    fi

 

makefile提供了简单的函数库管理方法,可以方便的将生成的.o文件添加到.a库文件之后

1 .c.a:
2     $(CC) -c $(CFLAGS) $<
3     $(AR) $(ARFLAGS) $@ $*.o

make -jN #允许make同时执行N条命令,项目的不同部分可以彼此独立的进行编译时,可以缩短编译时间

gcc -MM main.c xxx.c //gcc编译器将扫描源文件的include语句 然后生成一种可以直接插入到makefile文件的依赖关系

  

posted @ 2020-03-12 13:37  MrWang_tju  阅读(114)  评论(0编辑  收藏  举报