Ubuntu系统下使用gcc和Makefile工具完成对C语言程序的编译(附例)

(一)Ubuntu软件中参数设置及相关软件下载

1、在Ubuntu软件平台的终端中,编写文件默认使用的为vi工具,但是vi工具对于不熟悉该工具的新手会有诸多困难和问题(例如光标的移动需要键盘字母操控)。所以在此使用的是vim工具。在终端中输入如下命令,下载vim工具。命令:sudo apt-get install vim 。之后使用vi创建文件并编辑会自行跳转到vim工具进行操作。
2、设置vim编辑器(此步骤可省略):用vi打开文件/etc/vim/vimre。命令:sudo vi /etc/vim/vimrc,在此文件最后面输入代码:set ts=4和set nu用以显示行号。

(二)使用gcc编译“Hello World” C程序

 1、编写主函数c程序

*编写hello.c

2、gcc编译器编译hello.c文件然后运行

gcc命令格式如下:

gcc 【选项】 【文件名字】

常用选项如下:

-o 预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

-E 将test.c预处理输出test.i文件。

-S 将预处理输出文件test.i汇编成test.s文件。

-c 将汇编输出文件test.s编译输出test.o文件。

无选项链接 将编译输出文件test.o链接成最终可执行文件test。

-O 使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

*使用如下命令进行编译生成hello文件,并运行。

(三)使用gcc编译同一目录下不同文件

1、编写C程序(两数相除运算)

*编写main.c

*编写sub1.h

*编写sub1.c

2、gcc直接编译

*一命令:gcc -c sub1.c  将sub1.c程序转换为目标文件sub1.o

*二命令:gcc main.c sub1.o -o main 编译main.c文件为目标文件main.o,然后链接sub1.o目标文件生成main可执行文件。

*三命令:./main 执行生成的main文件,结果为12/4。并且文件中多了sub1.o和main的目标文件。

(四)windows平台下对应的相关程序

*工具:Visual Sudio C++

“程序代码及实现功能:与Ubuntu系统上的Linux系统程序基本一致

步骤如下:

1、编写C++程序

*编写main.cpp

*编写sub1.h

2、C++平台直接编译运行

3、两种编程及编译方式的对比

两种程序实现的功能相同,且编程代码也基本一致,但Ubuntu系统下需要多编写一项sub1.c的文件,而相比于一切操作命令在终端上运行的Ubuntu系统,windows平台上使用c++的编译操作会更加简洁,只需要两个文件在同一目录下即可一同一键编译,但是在Ubuntu系统下需要gcc的直接操作命令来转化成.o文件,在编译出想要的目标文件,更直观但是操作却略显繁琐。当同一目录下存在多个需要编译的文件时,修改其中的一项文件会导致gcc将所有文件重新编译,工程量大且耗时多。

(五)使用Makefile编译c程序

1、make工具及Makefile文件

当源代码文件过多时,使用gcc命令进行输入编译会导致重复性的工作产生,因为gcc命令的每次编译都需要将所有文件进行编译,而当只修改少数文件时,就会产生多余编译的操作,这时就需要使用make的自动化编译工具。

make软件用于将源代码编译成可执行的二进制文件,make工具主要用于完成自动化编译工作,包括修改几个源文件则重新编译这几个源文件、头文件被修改,则重新编译包含该头文件的所有源文件,make工具的编译则需要Makefile文件提供编译文件。

Makefile工具指明了make工具的编译规则,make工具就根据makefile中的命令进行编译和链接的。makefile命令中就包含了调用gcc去编译某个源文件的命令。

2、编写C程序

程序功能;从键盘上输入数字a和b,显示a乘b的结果

工程文件:包括main.c 、sub1.c 、sum.c 三个C文件和 sub1.h 、sum.h两个头文件,其中main.c为主体文件,sub1.c负责从键盘输入数值,sum.h负责进行两数相乘。

*编写 main.c

*编写sub1.c

*编写sum.c

*编写sub1.h

*编写sum.h

3、使用make和Makefile文件编译

*编写Makefile文件

*直接使用make命令,会执行编译功能,生成main文件

*运行结果展示:

*所有文件如下:

*删除编译产生的中间文件,在源文件目录下执行make clean命令即可删除编译过程中产生的*.o文件

(六)总结

通过这次在Ubuntu系统上编写C语言程序的实验,我学到了很多东西。通过与windows系统的对比,我发现两种程序实现的功能相同,且编程代码也基本一致,但Ubuntu系统下需要多编写一项sub1.c的文件,而相比于一切操作命令在终端上运行的Ubuntu系统,windows平台上使用c++的编译操作会更加简洁,只需要两个文件在同一目录下即可一同一键编译,但是在Ubuntu系统下需要gcc的直接操作命令来转化成.o文件,在编译出想要的目标文件,更直观但是操作却略显繁琐。

这次实验中我使用了两种方式编译C程序,一种为gcc直接编译,一种为make工具进行编译,两种方式分别适用不同的情况,在少量文件的情况下使用gcc直接编译,在多文件的情况下使用make工具进行编译,但两者的底层编译原理其实相同,都是一种将.c文件转换为.o的目标文件,再编译出程序。而make工具则是在此基础上添加了自动化编译的功能,更加智能减少了工作量。通过这种原始的编译方式,我更加直观感受到c文件编译为可执行文件的过程。让我更加熟悉了Ubuntu的相关命令和操作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
i == 15 || i == 22 || i == 29 || i == 36 || i == 49) { board[i在 Ubuntu使用 `make` 工具构建 C 语言程序项目时,编译过程是依据 `Makefile] = 5; } else if (i == 14 || i == 27 || i == 42) { board[i` 文件中编写的规则执行的。`Makefile` 文件是 `make` 工具使用的脚本文件,其中包含了编译过程中需要执行的命令和规则。 `Makefile` 文件中包含了多个规] = 4; } else if (i == 21 || i == 34) { board[i] = 3; 则,每个规则由一个或多个目标、依赖项和命令组成。规则描述了如何 } else if (i == 7 || i == 20 || i == 33 || i == 46) { board[i生成目标文件,以及生成目标文件所需要的依赖项和命令。`make` 工具会根据] = 2; } else if (i == 28) { board[i] = 1; } else if ( `Makefile` 文件中的规则来自动推导出需要执行的命令,以及命令的执行顺序i == 50) { board[i] = 7; } else { board[i] = 0; } 。 例如,下面是一个简单的 `Makefile` 文件示例: ```makefile hello: main.o add.o gcc -o hello main.o add.o main.o: main.c gcc -c main.c add.o: add.c } } // 获取指定位置的点类型 private static int getPointType(int pos) { return board[pos gcc -c add.c ``` 在这个 `Makefile` 文件中,包含了三个规则: 1.]; } // 获取下一个指定类型的点 private static int getNextPoint(int pos, int dir, int type) `hello` 规则:生成可执行程序 `hello`。该规则依赖于目标文件 `main.o` 和 ` { for (int i = pos + dir; i >= 0 && i < BOARD_SIZE; i += dir) { if (add.o`,执行 `gcc -o hello main.o add.o` 命令来生成可执行程序 `hello`。 2. `board[i] == type) { return i; } } return pos; } // 判断是否有玩家main.o` 规则:生成目标文件 `main.o`。该规则依赖于源文件 `main.c`,执行获胜 private static boolean isGameOver(boolean[] playerEnd) { int count = 0; for (int i = `gcc -c main.c` 命令来生成目标文件 `main.o`。 3. `add.o` 规则:生成0; i < PLAYER_NUM; i++) { if (playerEnd[i]) { count++; } } return count目标文件 `add.o`。该规则依赖于源文件 `add.c`,执行 `gcc -c add.c` 命令来生成目标文件 `add.o`。 在执行 `make` 命令时,`make` 工具会根据 >= 2; } } ``` 以上就是一个简单的飞行棋游戏实现,希望对你有帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值