Makefile编程基础 您所在的位置:网站首页 运行makefile文件 Makefile编程基础

Makefile编程基础

2023-03-15 04:35| 来源: 网络整理| 查看: 265

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。

1.示例代码

add.c

1 #include "add.h" 2 3 int add(int a, int b) 4 { 5 return a + b; 6 }

add.h

1 #ifndef __ADD_H__ 2 #define __ADD_H__ 3 4 int add(int a, int b); 5 6 #endif /* __ADD_H__ */

sub.c

1 #include "sub.h" 2 3 int sub(int a, int b) 4 { 5 return a - b; 6 }

sub.h

1 #ifndef __SUB_H__ 2 #define __SUB_H__ 3 4 int sub(int a, int b); 5 6 #endif /* __SUB_H__ */

main.c

1 #include 2 #include "add.h" 3 #include "sub.h" 4 5 int main() 6 { 7 int a = 1, b = 2; 8 9 printf("a + b = %d.\n", add(a, b)); 10 printf("a - b = %d.\n", sub(a, b)); 11 12 return 0; 13 }

编译如下:

gcc add.c sub.c main.c -o main

运行如下:

$ ./main a + b = 3. a - b = -1.

2.Makefile基础

简单实例:

1 all: 2 @echo "hello world." 3 echo "nihao world."

加@符和不加@符输出不同,加@只显示结果,不加@会把命令和结果都显示。

输出结果:

hello world. echo "nihao world." nihao world.

目标:依赖

Tab 命令

目标:一般是指要编译的目标,也可以是一个动作;依赖:指执行当前目标所要依赖的先项,包括其它目标,某个具体文件或库等,一个目标可以有多个依赖;命令:该目标下要执行的具体命令,可以没有,也可以有多条,多条时,每条命令一行;

make常用选项

make [-f file] [options] [target] # make默认在当前目录中寻找GNU Makefile,makefile的文件作为make的输入文件。 -f 可以指定除上述文件名之外的文件作为输入文件; -v 显示版本号; -d Debug; -n 只输出命令,但并不执行,一般用来测试; -s 只执行命令,但不显示具体命令,此处可在命令中用@符抑制命令输出; -w 显示执行前、执行后的路径; -C dir 指定makefile所在的目录;

没有指定目标时,默认使用第一个目标;如果指定,则执行对应的命令。

1 all:test1 2 echo "hello world." 3 4 test1: 5 echo "nihao world."

all依赖于test1,所以test1先执行,all后执行。执行结果:

nihao world. hello world.

根据本节知识点,第1节的编译可改为Makefile如下:

1 all: 2 gcc add.c sub.c main.c -o main 3 4 clean: 5 rm -rf main

3.GCC编译流程

直接从源码到编译出目标可执行文件

gcc main.c -o main

上述过程可细分为如下4个步骤:

1).预处理,得到main.ii

gcc -E main.c > main.ii

2).编译,得到main.s

gcc -S main.ii

3).汇编,得到main.o

gcc -c main.s

4).链接,得到可执行文件main

gcc main.o -c main

根据本节知识点,第2节的Makefile,优化如下:

1 main:add.o sub.o main.o 2 gcc add.o sub.o main.o -o main 3 4 add.o:add.c 5 gcc -c add.c -o add.o 6 7 sub.o:sub.c 8 gcc -c sub.c -o sub.o 9 10 main.o:main.c 11 gcc -c main.c -o main.o 12 13 clean: 14 rm -rf *.o main

4.变量

系统变量

$* 不包括扩展名的目标文件名称 $+ 所有的依赖文件,以空格分隔 $


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有