Linux下用C语言最基本的程序开发与调试
1.建一个目录
2.写代码,建一个hello.c文件
代码:
- #include "stdio.h"
- main()
- {
- printf("Hello Linux.\n")
- }
#include "stdio.h"
main()
{
printf("Hello Linux.\n")
}
记得最后一定要换行
3.编译
gcc -o hello hello.c
使用gcc 编译器就会为我们生成一个hello的可执行文件
4.输出
执行./hello就可以看到程序的输出
结果了.
是不是很简单?
命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译
器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.
gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道
了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而
不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序
进行调试的信息.
知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更
多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.
下面我们来演示怎样用GDB来调试一个求0+1+2+3+…+99的程序:
/* Filename:hello.c */ #include "stdio.h" printf("the sum of 1+2+...+ is %d", sum); |
执行如下命令编译hello.c(加-g选项产生debug信息):
#gcc –g –o hello sum.c
在命令行上键入gdb hello并按回车键就可以开始调试sum了,再运行run命令执行sum
#gdb hello
list命令用于列出源代码,对上述程序两次运行list,将出现如上画面(源代码被标行号)。
根据列出的源程序,如果我们将断点设置在第5行,只需在gdb 命令行提示符下键入如下命令设置断点:(gdb) break 5
设置断点的另一种语法是 break <function>,它在进入指定函数(function)时停住。
相反的,clear用于清除所有的已定义的断点,clear <function>清除设置在函数上的断点, clear <linenum>则清除设置在指定行上的断点。
watch命令:
watch命令用于观查变量或表达式的值,我们观查sum变量只需要运行watch sum
watch <expr>为表达式(变量)expr设置一个观察点,一量表达式值有变化时,程序会停止执行。
要观查当前设置的watch,可以使用info watchpoints命令。
next、step命令:
next、step用于单步执行,在执行的过程中,被watch变量的变化情况将实时呈现(分别显示Old value和New value)
next、step命令的区别在于step遇到函数调用,会跳转到到该函数定义的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作一条普通语句执行。
5.Make
make是所有想在Linux系统上编程的用户必须掌握的工具,对于任何稍具规模的程序,我们都会使用到make,几乎可以说不使用make的程序不具备任何实用价值。
在此,我们有必要解释编译和连接的区别。编译器使用源码文件来产生某种形式的目标文件(object files),在编译过程中,外部的符号参考并没有被解释或替换(即外部全局变量和函数并没有被找到)。因此,在编译阶段所报的错误一般都是语法错误。而连接器则用于连接目标文件和程序包,生成一个可执行程序。在连接阶段,一个目标文件中对别的文件中的符号的参考被解释,如果有符号不能找到,会报告连接错误。
编译和连接的一般步骤是:第一阶段把源文件一个一个的编译成目标文件,第二阶段把所有的目标文件加上需要的程序包连接成一个可执行文件。这样的过程很痛苦,我们需要使用大量的gcc命令。
而make则使我们从大量源文件的编译和连接工作中解放出来,综合为一步完成。GNU Make的主要工作是读进一个文本文件,称为makefile。这个文件记录了哪些文件(目的文件,目的文件不一定是最后的可执行程序,它可以是任何一种文件)由哪些文件(依靠文件)产生,用什么命令来产生。Make依靠此makefile中的信息检查磁盘上的文件,如果目的文件的创建或修改时间比它的一个依靠文件旧的话,make就执行相应的命令,以便更新目的文件。
假设我们写下如下的三个文件,add.h用于声明add函数,add.c提供两个整数相加的函数体,而main.c中调用add函数:
/* filename:add.h */ extern int add(int i, int j); /* filename:add.c */ /* filename:main.c */ |
怎样为上述三个文件产生makefile呢?如下:
test : main.o add.o gcc main.o add.o -o test main.o : main.c add.h add.o : add.c add.h |
上述makefile利用add.c和add.h文件执行gcc -c add.c -o add.o命令产生add.o目标代码,利用main.c和add.h文件执行gcc -c main.c -o main.o命令产生main.o目标代码,最后利用main.o和add.o文件(两个模块的目标代码)执行gcc main.o add.o -o test命令产生可执行文件test。
我们可在makefile中加入变量,另外。环境变量在make过程中也被解释成make的变量。这些变量是大小写敏感的,一般使用大写字母。Make变量可以做很多事情,例如:
i) 存储一个文件名列表;
ii) 存储可执行文件名;
iii) 存储编译器选项。
要定义一个变量,只需要在一行的开始写下这个变量的名字,后面跟一个=号,再跟变量的值。引用变量的方法是写一个$符号,后面跟(变量名)。我们把前面的 makefile 利用变量重写一遍(并假设使用-Wall -O –g编译选项):
OBJS = main.o add.o CC = gcc CFLAGS = -Wall -O -g test : $(OBJS) main.o : main.c add.h add.o : add.c add.h |
makefile 中还可定义清除(clean)目标,可用来清除编译过程中产生的中间文件,例如在上述makefile文件中添加下列代码:
clean: rm -f *.o |
运行make clean时,将执行rm -f *.o命令,删除所有编译过程中产生的中间文件。
不管怎么说,自己动手编写makefile仍然是很复杂和烦琐的,而且很容易出错。因此,GNU也为我们提供了Automake和Autoconf来辅助快速自动产生makefile,读者可以参阅相关资料。
7.小结
本章主要阐述了Linux程序的编写、编译、调试方法及make,实际上就是引导读者学习怎样在Linux下编程,为后续章节做好准备。
参考:
Linux下的C编程实战之开发平台搭建
http://dev.yesky.com/474/7596974.shtml
Linux系统下的C语言编程入门:
http://dev.yesky.com/topic/299/7654799.shtml
C语言初学者入门讲座
http://www.programfan.com/article/subject1.asp
linux操作系统下c语言编程入门<unix操作系统下同样适用>
http://www.chinaunix.net/jh/23/56653.html
Linux下用C语言最基本的程序开发与调试相关推荐
- linux ctg重装,Linux系统中CTG的安装,应用程序开发以及调试
准备 1)CICS Transaction Gateway for Multiplatforms, CICS Transaction Gateway Desktop Edition 和 CICS Un ...
- Mysql —— linux下使用c语言访问mySql数据库
示例1: #include<stdio.h> #include<mysql.h> int main() { MYSQL mysql; mysql_init(&mysql ...
- linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程
linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程 server.c #include <sys/stat.h>#include <fcntl.h> ...
- Third Week :Linux下的C语言
Linux下的C语言 1. 搭建C语言开发环境/运行环境 1. 文本编辑 2. 编译器 3. 头文件和系统预装文件 4. make 工具 5. echo 2. 标准输入流/输出流/错误流 1. 重定向 ...
- linux c语言 信号,linux下基于C语言的信号编程实例
搜索热词 本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include #include #include #include #include void si ...
- Linux下C语言串口应用编程,Linux下串口C语言编程
Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...
- c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...
求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...
- 实验linux下的编程,实验四 Linux下的C语言编程;
<实验四 Linux下的C语言编程;>由会员分享,可在线阅读,更多相关<实验四 Linux下的C语言编程;(5页珍藏版)>请在人人文库网上搜索. 1.实验四Linux 下的 C ...
- linux下的C语言编程(总结篇)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在Linux下面关于C语言的内容其实挺多的.不同的人关注的地方也不一样.关注系统设计的人可能更 ...
最新文章
- anaconda越新越好吗
- QZEZ第一届“饭吉圆”杯程序设计竞赛
- Java中接口的多继承
- ORB_SLAM2+ZED 2
- 算法竞赛入门经典(刘汝佳版)例题与解答
- PMP 备考指南之计算题汇总
- JAVA SE — Day 18
- vue获取本地IP地址 自动配置本地请求地址
- idea设置前进、后退快捷键
- 视频文件顺时针旋转90度
- Git恢复已删除文件
- ArcGIS Pro建立三维模型(三维渲染)
- Java毕设项目菜鸟驿站快递分发系统计算机(附源码+系统+数据库+LW)
- java shp文件_java发布shp数据
- 博易终于发布新版本了
- python 文本转excel_Python 文本(txt) 转换成 EXCEL(xls)
- VMware Vsphere-下
- Web 开发学习笔记——关于互联网和互联网应用
- Python爬虫实战,requests+xpath模块,Python实现爬取豆瓣影评
- Java启动子进程以及父子进程间通信
热门文章
- ebnf描述c语言语句结构,EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则...
- linux学 java_[操作系统]Linux学习第二步(Java环境安装)
- mysql substr 中文乱码_刚碰到的MySql乱码的问题
- Java8 新的 try-with-resources 语句,自动资源释放
- (C++)数组作为函数参数
- 【深度学习理论】(4) 权重初始化,Batch Normalization
- 【python】用numpy随机生成一元(多元)数据;如线性、指数、三角函数,或者多种样式结合
- sqlmap 连接mysql_sqlmap连接Mysql实现getshell | CN-SEC 中文网
- TensorFlow 输出tensor数据
- 斐波那契算法举例(iterative Fibonacci algorithm)