Ubuntu系统使用gcc和Makefile编译C程序

卷首:

1.gcc

GCC(GNU编译器集合)是自由软件基金会发起的一项自由软件项目,旨在开发一个完全自由的编程语言编译器集合。它的历史可以追溯到1985年,当时GNU计划的发起人理查德·斯托曼希望创建一个自由的类Unix操作系统,并创建了一些基础工具,其中包括编译器。

初始的GCC项目是以C语言编写的,它的原名是GNU C Compiler。它最初的目的是为了在GNU操作系统上提供一个可靠的C编译器,因为当时市场上的编译器要么是闭源的商业软件,要么无法满足GNU计划的自由软件要求。GCC在1987年发表了第一个版本,很快就被广泛接受和使用。

在随后的几年中,GCC逐渐演变成为一组编译器,可以编译多种编程语言,包括C、C++、Fortran、Java、Objective-C和Ada等。在1990年代中期,GCC成为了业界最流行的编译器之一,并逐渐取代了很多商业编译器的地位。

现在,GCC被广泛用于开发各种类型的应用程序,包括嵌入式系统、高性能计算、桌面应用程序、网络应用程序等。它仍然是GNU计划中最为重要的软件之一,也是自由软件运动的重要成果之一。

2.Makefile

Makefile的历史可以追溯到1960年代的贝尔实验室。当时,编译大型程序是一项非常耗时的任务,并且程序员必须手动编译整个程序。为了解决这个问题,贝尔实验室的计算机科学家们开发了一种自动化编译系统,称为Make。

Make最初是由Stuart Feldman在1976年为贝尔实验室的Unix操作系统开发的。Make的想法是将源代码文件和编译指令放在一个Makefile中,然后使用一个名为“make”的工具来自动化构建过程。Makefile中的规则指定了如何转换一个或多个源文件到可执行文件。Make工具会根据Makefile中的规则和依赖关系,自动决定哪些文件需要重新编译,然后执行适当的编译步骤。

随着时间的推移,Makefile成为Unix和Linux等操作系统中编译和自动化构建的主要工具之一。当今,许多编程语言和框架都使用Makefile或类似的工具来帮助自动化编译、测试和部署代码。

1.在Ubuntu系统下用C语言编写一个简单的输出 hello word 的程序,并编译有、运行之

1.使用nano创建一个文件

nano hello.c

ps:使用

mkdir #后面接上的是目录名字

创建文件目录

2.进入nano编程

#include "stdio.h"

int main()
{
printf("hello world!");
}

基本运行机理与c一致

3.运行

g++ source -o target// 指定语言类型为c语言 (Windows下默认为a.exe, Linux下默认为a.out)

ps:如果

出现:command not found 的错误信息则说明可能是没有安装g++

键入

sudo apt_get install g++

输入后使得文本文件编译成一个可执行程序。我们检查目录可发现新的文件a.out

ls

输入

./a.out

 即可以开始运行此程序。

2.请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main1.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。

编写

主程序main1.c

子程序sub1.c 

头文件 sub1.h

 gcc直接编译
步骤一

gcc -c sub1.c


作用:将sub1.c程序转换为目标文件sub1.o
步骤二

gcc main1.c sub1.o -o main1


作用:编译main1.c文件为目标文件main1.o,然后链接sub1.o目标文件生成main1可执行文件
步骤三
执行命令

./main1

即可执行编译生成的main1程序

注:此次是静态库编写

动态库在编译main.c,并链接libtest.so的时候,直接指定使用当前目录下的libtest.so文件,

使用命令:gcc -o main main.c ./libtest.so

而二者的主要区别如下:

1. 静态库在编译时链接到可执行文件中,而动态库在运行时加载到内存中。

2. 静态库体积较大,因为它包含完整的代码和数据,而动态库只包含被使用的部分。

3. 静态库的更新需要重新编译整个程序,而动态库可以直接替换。

4. 静态库可以提高执行速度,因为所有代码都链接到可执行文件中。而动态库可以减少内存占用,因为多个程序可以共用一份库文件。

5. 动态库可以实现代码的动态加载和卸载,方便程序的扩展和维护。

总之,动态库和静态库都有各自的优势和适用场景,程序开发者需要根据具体情况进行选择。

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

 四

在ubuntu系统下用Makefile方式编程主程序。

target:prerequisites
	command			# command以一个tab键开始

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

ps:makefile中使用空格是可以的,但是要注意空格的数量和位置对代码的影响。在makefile中,空格用于分隔命令和参数,并且一定要用制表符或空格进行缩进。如果空格数量或位置不正确,会导致makefile无法正确解析命令。因此,在编写makefile时,一定要谨慎使用空格,并且使用一致的缩进方式

main1:sub1.o main1.c
    gcc main1.c sub1.o -o main1
 
sub1.o:sub1.c
    gcc -c sub1.c -o sub1.o
 
 
.PHONY : clean
clean:
    rm *.o # 为了防止文件同名出错,通过.PHONY声明了为目标clean。clean目标没有依赖,当执行make clean时将会删除所有.o文件。
常见的makefile命令和功能如下:

make:使用make命令来执行makefile文件。

clean:清除生成的目标文件和中间文件。

target:指定目标文件的生成方式和依赖关系。

dependencies:指定目标文件依赖的其他文件,用于判断是否需要重新生成目标文件。

variables:定义变量,可以在makefile中引用和修改。

include:包含其他makefile文件。

default:指定默认的目标文件生成规则。

all:生成所有目标文件。

install:将生成的目标文件安装到指定位置。

test:运行测试脚本或测试程序。

help:显示帮助信息。

使用make

再用./main1(程序!启动)

5总结:

windows上编程虽然较为简单ide一键编译但ubantu上编程虽然较为原始但能更加清晰的了解到程序的来历。在编译的过程中更加深刻的理解了程序。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值