ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

5.makefile

2021-10-06 13:34:49  阅读:175  来源: 互联网

标签:文件 gcc int makefile myproject test myadd


makefile

一、gcc

gcc是用来编译代码的编译器

编译完之后有一些常见的输出文件
1 .a	静态库(文档)
2 .c	需要预处理的c语言源代码
3 .h	C语言源代码的头文件
4 .i	经过预处理后的C语言源代码
5 .o	目标文件(经过汇编产生)
6 .s	经过编译后产生的汇编语言代码
7 .elf	可执行文件(linux下的可执行文件)
    
//编译过程
.c -》 .i -》 .s -》 .o
//链接过程
把多个.o链接成一个可执行文件(ELF/.exe)
-o:是输出的意思
1. gcc -E test.c -o test.i  //查看经过预处理之后的c语言源代码
    
2. gcc -s test.c -o test.s  //查看编译后产生的汇编语言编码
   gcc -s test.i -o test.s	 //也可以查看编译后产生的汇编语言编码
   //意思就是.c文件可以直接到.s文件,也可以.c——>.i——>.s
    
3. gcc -c test.c -o test.o  //形成目标文件
4. gcc test.o -o test	//形成可执行文件
//经过上面四步形成了可执行文件
 
5. gcc test.c -o hello //直接将test.c编译成叫hello的可执行文件
    
6. ./hello //运行hello这个可执行文件
.0——二进制可执行代码(机械码),不具备可执行的能力
    

二、makefile---数据库文件或则叫文本文件

linux的过程都是自己可以控制的

在gcc中可以通过将.c文件编译成.o文件

那么如果有多个.c文件呢,这些都要编译成.o文件,这样需要输入多条指令去执行吗?

可以通过makefile

例如:

myadd.h文件
int myAdd(int a,int b);

myadd.c文件
#include<myadd.h>
int myAdd(int a,int b)
{
    return a+b;
}

mysub.h文件
int mySub(int a,int b);

mysub.c文件
#include<mysub.h>
int mySub(int a,int b)
{
    return a-b;
}

muproject.c文件
#include<stdio.h>
#include<myadd.h>
#include<mysub.h>
void main()
{
    int num1=10;
    int num2=20;
    int num3=30;
    printf("%d\n",myAdd(num1,mySub(num2,num2)));
}

myproject.c文件引用了两个自定义的头文件,那么要实现myproject.c就必须将三个自定义的.c文件编译成.o文件,然后再将这三个.o文件一起链接成一个可执行文件
    
    gcc -c myadd.c -o myadd.o
    gcc -c mysub.c -o mysub.o
    gcc -c myproject.c -o myproject.o
    gcc  myadd.o mysub.o myproject.o -o test1

makefile的好处:自动化编译

make命令,需要一个makefile文件,在makefile文件中去告诉make命令需要这怎样去编译和链接程序。makefile是一个文本形式的数据库文件,包含一些规则来告诉make处理哪些文件以及如何处理这些文件

规则

target:depend
    command
    整个算一条执行语句
target:目标,可以是一个中间文件,也可以是一个最终的执行文件
depend:依赖,指要生成目标文件所需要的文件或目标
command:make需要执行的命令
//gcc -c test.c -o test.0——gcc就是命令,test.c是依赖,test.o是目标
  
hello.i:hello.c
    gcc -E -o hello.i hello.c

makefile执行顺序

默认执行第一条语句,在执行第一条时,先找所有的依赖文件,如果没有,继续往下找有没有脚本能生成这个依赖文件,如果有就会先执行下面生成依赖文件的语句
test:prog.o code.o
    gcc -o test prog.o code.o
prog.o:prog.c
    gcc -c prog.c -o prog.o
code.o:code.c
    gcc -c code.c -o code.o
             
clean:
	rm -f *.o
//清除,伪目标,没有依赖项
        
myproject:myadd.o mysub.o myproject.o
	gcc myadd.o mysub.o myproject.o -o myproject
myadd.o:myadd.c
	gcc -c myadd.c -o myadd.o
mysub.o:mysub.c
	gcc -c mysub.c -o mysub.o
myproject.o:myproject.c
	gcc -c myproject.c -o myproject.o
clean:
	rm -f *.o myproject
           

makefile变量

变量理解为字符串
OBJ = a b c	  表示OBJ就是 a b c这三个变量,不能再改变了
OBJ := a b c  表示OBJ是 a b c这三个变量,但是可以用+=去追加
OBJ += d	表示OBJ变量添加了 d 这一个变量
  
变量引用:
    $(变量名)
 

makefile示例

通配符:% * ?
    %——表示任意一个
    *——表示所有
    ?——表示匹配一个未知的东西
OBJ:=myadd.o mysub.o
OBJ+=myproject.o
    
myproject:$(OBJ)
    gcc $(OBJ) -o myproject
*.o:*.c
    gcc -c *.c -o *.o
    
.MYDEL://表示clean是一个伪标签
clean:
	rm -rf *.o myproject
        
$@——表示目标文件
$^——表示依赖文件
      
target=myproject
OBJ:=myadd.o mysub.o
OBJ+=myproject.o
CC:=gcc
CFLAGS:=-C
    
$(target):$(OBJ)
    $(CC) $^ -o $@
*.o:*.c
    $(CC) $(CFLAGS) $^ -o $@
    
.MYDEL://表示clean是一个伪标签
clean:
	rm -rf *.o $(target)

标签:文件,gcc,int,makefile,myproject,test,myadd
来源: https://www.cnblogs.com/Kissfly123/p/15371093.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有