来自 澳门新葡亰 2019-11-12 13:32 的文章
当前位置: 澳门新葡亰app > 澳门新葡亰 > 正文

澳门新葡亰app决定先编译哪些文件,最后一步链

现身变量重定义的气象?

一、简介

源文件与include的文书定义了同叁个变量

main.c

1 #include <stdio.h>
2 #include "a.c"
3 
4 int a = 100;
5 
6 int main() {
7 
8     return 0;
9 }

a.c

 1 int a = 200; 

编写翻译命令:

gcc main.c -o main

编写翻译报错:

 澳门新葡亰官网APP 1

make命令施行时,要求二个 Makefile 文件,以报告make命令要求什么的去编写翻译和链接程序(轻巧将:管理工科程的公文,决定先编写翻译哪些文件,编写翻译顺序卡塔尔国。

链接的四个公文都定义了同二个变量

main.c

1 #include <stdio.h>
2 
3 int a = 100;
4 
5 int main() {
6 
7     return 0;
8 }

a.c

int a = 200;

编写翻译命令:

gcc -c main.c -o main.o

gcc -c a.c -o a.o

gcc main.o a.o -o main

最后一步链接会报错:

 澳门新葡亰官网APP 2

二、编写法规:

对象1:指标信赖  然后回车+tab键
 命令;

对象2:目的正视  然后回车+tab键
 命令;
...

指标n:目的倚重  然后回车+tab键
 命令;

在乎:命令必需是tab键开端的。

三、Makefile演进
1、三个门类有main.c/a.c/a.h/b.c/b.h五个文件;main.c饱含a.h和b.h并行使相关函数;然后建立二个新的Makefile文件,内容如下:
main:a.o b.o
 gcc -o main a.o b.o 
a.o:a.c
 gcc -c a.c -o a.o 
b.o:b.c
 gcc -c b.c -o b.o

2、Makefile升级1
利用makefile变量:想用就用,未有项目,无需定义(引用变量使用$(obj)来含有愈来愈多.o文件卡塔尔国
方法:obj:=a.o b.o
那便是说地方的Makefile程序晋级如下:
obj:=a.o b.o
main:$(obj)
 gcc -o main a.o b.o 
a.o:a.c
 gcc -c a.c -o a.o 
b.o:b.c
 gcc -c b.c -o b.o

3、Makefile升级2
因而以上七个makefile的编写翻译,项目举行是打响的,不过只要main.c供给援用更多文件中的函数时,是不是要填写那么多的编写翻译命令吗?鲜明这些方法不可取。
精雕细琢:makefile特殊变量和电动推导效率
知识点表明:
$@  代表指标名,
$^  代表信赖文件
%  代表私行字符
%.o  代表任性.o文件
澳门新葡亰官网APP,%.c  代表放肆.c文件

以上Makefile进级如下:
obj:=a.o b.o
main:$(obj)
澳门新葡亰app, gcc -o main $(obj) 
%.o:%c      #讲明:形式通配,自动将.c文件编写翻译成.o文件
 gcc -o $@ -c $^    #注释:通配符
clean:
 rm -rf *.o main

4、Makefile升级3
exe=main      #评释:最后的编写翻译结果名字
obj:=main.o a.o b.o c.o   #申明:信任文件
all:$(obj)
gcc -o $(exe) $(obj)
%.o:%.c
gcc -c $^ -o $@
clean:
rm -rf $(obj) $(exe)

上述程序看似未有怎么难点的,不过clean有一些短处,借使也会有贰个文书叫clean那怎么做?假如make clean就不能够试行那条命令。

5、Makefile升级4
利用伪目的.PHONY来消除clean短处难题,晋级Makefile如下:
exe:=main
obj:=main.o a.o b.o c.o
all:$(obj)
 gcc -o $(exe) $(obj)
%.o:%.c
 gcc -c $^ -o $@
.PHONY:clean     #注明:申明clean是伪目的
clean:
 rm -rf $(obj) $(exe)

注释#.PHONY:clean注脚伪指标,幸免当前目录存在名叫clean文件的时候吩咐不能够实践的景色

6、Makefile升级5
一时利用的编写翻译器大概是g++、gcc甚至是arm-linux-gcc。为了有扶植统意气风发管理,最棒早先定义二个变量来表示编辑器,然后在gcc命令上产生$(CC):
Makefile进级如下:
CC:=gcc    #表明:定义叁个变量,表示方今编辑器为gcc
exe:=main
obj:=main.o a.o b.o c.o
all:$(obj)
 $(CC) -o $(exe) $(obj) 
%.o:%.c
 $(CC) -c $^ -o $@
.PHONY:clean
clean:
 rm -rf $(obj) $(exe)

相当多将来的Makefie能够编写制定超级多经常见到的主次了。秩序要对Makefile的文本名合适稍加校订就能够。假使在可比大型的次第里面写Makefile会相对知识点多或多或少,举例增添静态库、动态库、线程等等;后续再做提高。

引入一本书:GNU make汉语手册(翻译整理:徐海兵卡塔 尔(英语:State of Qatar)

本文长久更新链接地址:http://www.linuxidc.com/Linux/2017-06/145306.htm

澳门新葡亰官网APP 3

本文由澳门新葡亰app发布于澳门新葡亰,转载请注明出处:澳门新葡亰app决定先编译哪些文件,最后一步链

关键词: