1.建一个目录

2.写代码,建一个hello.c文件

代码:

view plaincopy to clipboardprint?
  1. #include "stdio.h"
  2. main()
  3. {
  4. printf("Hello Linux.\n")
  5. }
#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"
main()
{
int i, sum;
sum = 0;
for (i = 0; i < 100; i++)
{
sum + = i;
}

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 */
int add(int i, int j)
{
return i + j;
}

/* filename:main.c */
#include "add.h"
main()
{
int a, b;
a = 2;
b = 3;
printf("the sum of a+b is %d", add(a + b));
}

  怎样为上述三个文件产生makefile呢?如下:

test : main.o add.o
gcc main.o add.o -o test

main.o : main.c add.h
gcc -c main.c -o main.o

add.o : add.c add.h
gcc -c add.c -o add.o

  上述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)
$(CC) $(OBJS) -o test

main.o : main.c add.h
$(CC) $(CFLAGS) -c main.c -o main.o

add.o : add.c add.h
$(CC) $(CFLAGS) -c add.c -o add.o

  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语言最基本的程序开发与调试相关推荐

  1. linux ctg重装,Linux系统中CTG的安装,应用程序开发以及调试

    准备 1)CICS Transaction Gateway for Multiplatforms, CICS Transaction Gateway Desktop Edition 和 CICS Un ...

  2. Mysql —— linux下使用c语言访问mySql数据库

    示例1: #include<stdio.h> #include<mysql.h> int main() { MYSQL mysql; mysql_init(&mysql ...

  3. linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程

    linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程 server.c #include <sys/stat.h>#include <fcntl.h> ...

  4. Third Week :Linux下的C语言

    Linux下的C语言 1. 搭建C语言开发环境/运行环境 1. 文本编辑 2. 编译器 3. 头文件和系统预装文件 4. make 工具 5. echo 2. 标准输入流/输出流/错误流 1. 重定向 ...

  5. linux c语言 信号,linux下基于C语言的信号编程实例

    搜索热词 本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include #include #include #include #include void si ...

  6. Linux下C语言串口应用编程,Linux下串口C语言编程

    Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...

  7. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

    求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...

  8. 实验linux下的编程,实验四 Linux下的C语言编程;

    <实验四 Linux下的C语言编程;>由会员分享,可在线阅读,更多相关<实验四 Linux下的C语言编程;(5页珍藏版)>请在人人文库网上搜索. 1.实验四Linux 下的 C ...

  9. linux下的C语言编程(总结篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在Linux下面关于C语言的内容其实挺多的.不同的人关注的地方也不一样.关注系统设计的人可能更 ...

最新文章

  1. 京东618:智能机器人JIMI的进击之路
  2. python中left是什么意思_Python left
  3. Skywalking-10:Skywalking查询协议——GraphQL
  4. jsmind(Jsmind数据格式)
  5. IOS开发之逆向分析
  6. 网付代理利润我把它分析得透透的
  7. [Unity]寻路导航
  8. 1148 数字字符出现频率
  9. HNOI 2015 亚瑟王 题解
  10. 拥塞控制算法(Congestion Control)对比
  11. 关于使用sdkmanager命令报错(环境:Mac+Android SDK)
  12. html中加入清除浮动,HTML中清除浮动的几种办法
  13. 关于NSDateFormatter年份计算超前问题
  14. python编码与解码
  15. 所有的事情都会趋于平淡
  16. Linux系统下生成证书 https证书
  17. 引入第三方图标库,并在前台罗列图标
  18. 基于机器学习的疲劳驾驶检测系统
  19. 谷粒商城三阶段课件_备考2021年初级会计考试几大阶段你知道吗?
  20. echarts地图循环增加铁路线

热门文章

  1. www服务器提供的第一个信息页面,第14章WWW服务
  2. uefi 嵌入式Linux,面向嵌入式平台的高级UEFI开发环境.PDF
  3. aspx跳转页面的符号_解决SpringBoot+MyBatis框架下页面跳转问题与代码优化处理。...
  4. 深度学习在图像领域的几大任务
  5. linux禁止向指定ip发送数据包,Linux下使用iptables封锁端口禁止邮件发送
  6. 喂~讲真~我很讨厌chrome谷歌浏览器的默认填充输入框input样式咧,敲击讨厌滴啦,怎么去掉介个样式尼
  7. 在Ubuntu 14.04 64bit下用Python搭建数据科学研究环境
  8. windows下rpc框架thrift的环境配置
  9. 解决Eclipse添加新server时无法选择Tomcat7的问题
  10. 关于python3与python2同时存在情况下导入pyqt失败解决记录