新濠天地 > c语言 > 最后一步链接会报错,以告诉make命令需要怎么样

原标题:最后一步链接会报错,以告诉make命令需要怎么样

浏览次数:200 时间:2019-09-23

出现变量重定义的景观?

一、简介

源文件与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

编译报错:

 图片 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

最终一步链接会报错:

 图片 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文件
%.c  代范例性.c文件

如上Makefile晋级如下:
obj:=a.o b.o
main:$(obj)
 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粤语手册(翻译整理:徐海兵)

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

图片 3

本文由新濠天地发布于c语言,转载请注明出处:最后一步链接会报错,以告诉make命令需要怎么样

关键词:

上一篇:新濠天地它防止程序员写代码来实例化该静态类

下一篇:没有了