用make进行宏编译

    xiaoxiao2021-08-20  105

    make的功能是可以简化编译过程里面所执行的命令。

    假设我的执行文件里面包含了4个源码文件,分别是 main.c、haha.c、sin_value.c、cos_value.c 这4个文件,这4个文件的目的是:

    main.c:  让用户输入角度数据与调用其他3个子程序;

    haha.c:  输出一堆信息而已;

    sin_value.c:  计算用户输入的角度的sin值

    cos_value.c:  计算用户输入的角度的cos值。

    这4个文件里面包含了相关性,并且还用到数学函数在里面,所以如果你想让这个程序可以运行,那么需要这样编译:

    1. 先进行目标文件的编译,最终会有四个*.o 的文件名出现:

    # gcc -c main.c

    # gcc -c haha.c

    # gcc -c sin_value.c

    # gcc -c cos_value.c

    2. 再进行链接成为可执行文件,并加入libm 的数学函数,以生成main 可执行文件

    # gcc -o main main.o haha.o sin_value.o cos_value.o \

    > -lm -L/usr/lib -L/lib

    3. 执行程序

    # ./main

    编译的过程需要进行好多操作,而且如果需要重新编译,则上述的流程得要重新来一遍,如果可以的话,能不能一个步骤就完成上面所有的操作?那就是利用make这个工具。

    1. 先编辑makefile这个规则文件,内容只要制作出main 这个可执行文件

    main: main.o haha.o sin_value.o cos_value.o

              gcc -o main main.o haha.o sin_value.o cos_value.o -lm

    以上面的测试为例,我们仅写出main 需要的目标文件,结果make 会主动去判断每个目标文件相关的源码文件,并直接予以编译,最后再直接进行链接的操作。此外,如果我们改动过某些源码文件,则make 也可以主动判断哪一个源码与相关的目标文有更新过,并仅更新该文件,如此一来,将可大大节省很多编译的事件。make 好处:

    简化编译时所需要执行的命令;若在编译完成之后,修改了某个源码文件,则make 仅会针对被修改了的文件进行编译,其他的目标文件不会被更改;最后可以按照相依性来更新执行文件 make里面最需要注意的就是那个规则文件,也就是makefile 这个文件的语法。 makefile 的基本语法与变量 基本的makefile 规则是这样的: 目标(target): 目标文件1 目标文件2 <tab>    gcc -o 欲新建的可执行文件 目标文件1 目标文件2 那个目标(target)就是我们想要建立的信息,而目标文件就是具有相关性的 object files,那建立可执行文件的语法就是以<tab>按键开头的那一行!特别留意的是:命令行必须要以tab 按键作为开头才行。它的基本规则是这样的: 在makefile 当中的#代表批注;<tab> 需要在命令行(例如gcc 这个编译程序命令)的第一个字符;目标(target)与相关文件(就是目标文件)之间需以“:”隔开。 如果我想要有两个以上的执行操作 main: main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o -lm clean: rm -f main main.o haha.o sin_value.o cos_value.o我们的makefile 里面就具有至少两个目标,分别是 main 与 clean,如果我么想要建立 main 的话,输入“make main”,如果想要清除信息,输入“make clean”即可。而如果想要先清除目标文件再编译main 这个程序的话,就可以这样输入:make clean main 我们可以通过变量来简化makefile LIBS=-lm OBJS=main.o haha.o sin_value.o cos_value.o main: ${OBJS} gcc -o main ${OBJS} ${LIBS} clean: rm -f main ${OBJS}与 bash shell script 的语法有点不太相同,变量的基本语法为: 变量与变量内容以“=”隔开,同时两边可以具有空格;变量左边不可以有<tab>,例如上面范例的第一行LIBS左边不可以是<tab>;变量与变量内容在“=”两边不能具有“:”在习惯上,变量最好是以“大写字母”为主;运用变量时,以${变量}或$(变量)使用在该shell 的环境变量是可以被套用的,例如提到的CFILAGS 这个变量;在命令行模式也可以定义变量。 由于gcc 在进行编译的行为时,会主动去读取CFLAGS这个环境变量,所以,你可以直接在shell 定义出这个环境变量,也可以在makefile 文件里面去定义,更可以在命令列当中定义。 CC = gcc #Using -Ofast instead of -O3 might result in faster code, but is supported only by newer GCC versions CFLAGS = -lm -pthread -O3 -march=native -Wall -funroll-loops -Wno-unused-result all: word2vec word2phrase distance word-analogy compute-accuracy word2vec : word2vec.c $(CC) word2vec.c -o word2vec $(CFLAGS) word2phrase : word2phrase.c $(CC) word2phrase.c -o word2phrase $(CFLAGS) distance : distance.c $(CC) distance.c -o distance $(CFLAGS) word-analogy : word-analogy.c $(CC) word-analogy.c -o word-analogy $(CFLAGS) compute-accuracy : compute-accuracy.c $(CC) compute-accuracy.c -o compute-accuracy $(CFLAGS) chmod +x *.sh clean: rm -rf word2vec word2phrase distance word-analogy compute-accuracy 环境变量取用的规则是这样的: make 命令行后面加上的环境变量为第一优先;makefile 里面指定的环境变量第二优先;shell 原本具有的环境变量第三优先。 $@:  代表当前的目标(target)

    转载请注明原文地址: https://ju.6miu.com/read-676742.html

    最新回复(0)