在Ubuntu系统编译C语言程序,gcc与makefile的应用

在Ubuntu系统编译C语言程序,gcc与makefile的应用

直接使用gcc 的命令有限制,不过系统会提示安装gcc的命令,安装好后先复习一下gcc命令:

常用gcc编译命令选项


假设源程序文件名为test.c。

  1. 无选项编译链接
    用法:#gcc test.c
    作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

  2. 选项 -o
    用法:#gcc test.c -o test
    作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

  3. 选项 -E
    用法:#gcc -E test.c -o test.i
    作用:将test.c预处理输出test.i文件。

  4. 选项 -S
    用法:#gcc -S test.i
    作用:将预处理输出文件test.i汇编成test.s文件。

  5. 选项 -c
    用法:#gcc -c test.s
    作用:将汇编输出文件test.s编译输出test.o文件。

  6. 无选项链接
    用法:#gcc test.o -o test
    作用:将编译输出文件test.o链接成最终可执行文件test。

  7. 选项-O
    用法:#gcc -O1 test.c -o test
    作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

上述摘自csdn bible_reader: GCC编译常用命令

一、编译运行hello world c语言程序

在这里插入图片描述

在这里插入图片描述

二、编写一个主程序文件 main1.c 和一个子程序文件 sub1.c

要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;

主程序main1.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。

1) 请在ubuntu系统用gcc 命令行方式编译主程序main1.c 并运行;

2) 请在windows系统下用你熟悉的编译工具编译主程序main1.c 并运行。

  • sub1.h
    在这里插入图片描述
  • sub1.c
    在这里插入图片描述
  • main1.c
    在这里插入图片描述

gcc 编译:

先将sub1.c 编译为 .o 结尾的目标文件,再把 main1.c 文件编译为目标文件后与 sub1.o 链接,变成可执行的 main1 文件。

如图,执行 main1 后得到两数相乘并转为浮点数保留两位小数输出的结果 90.00。
在这里插入图片描述

三、windows编写一个主程序文件 main1.c 和一个子程序文件 sub1.c

使用qt编写上面三个一样的文件,运行界面如下:
在这里插入图片描述

四、makefile编译主程序文件 main1.c 和一个子程序文件 sub1.c

安装makefile:

        sudo apt install make
        sudo apt install make-guile

首先,makefile的规则是:

1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。

3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

makefile规则

target… : prerequisites …
command

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

【注】:在看别人写的Makefile文件时,你可能会碰到以下三个变量:$@,$^,$<代表的意义分别是:

$@ 目标文件,$^ 所有的依赖文件,$< 第一个依赖文件。

所以,根据这几个文件之间的依赖关系编写名字为makefile的文档

在这里插入图片描述
在这里插入图片描述

makefile部分知识摘自csdn GUYUEZHICHENG:Makefile教程(绝对经典,所有问题看这一篇足够了)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值