`
tiandirensoon
  • 浏览: 591677 次
文章分类
社区版块
存档分类
最新评论

Linux下用C语言最基本的程序开发与调试

 
阅读更多

1.建一个目录

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

代码:

  1. #include"stdio.h"
  2. main()
  3. {
  4. printf("HelloLinux.\n")
  5. }


记得最后一定要换行

3.编译

gcc-ohellohello.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 –ohello 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

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

代码:

  1. #include"stdio.h"
  2. main()
  3. {
  4. printf("HelloLinux.\n")
  5. }


记得最后一定要换行

3.编译

gcc-ohellohello.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 –ohello 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语言开发工具

    掌握这些工具的使用是至关重要的,它直接影响到程序开发的效率。因此,希望读者能自己动手操作,切实熟练掌握这些工具的使用。通过本章的学习,读者将会掌握如下内容: &lt;br&gt;■ C语言的产生历史背景 ■ ...

    凯征调试器 一款在Linux下搭建的简单C语言IDE开发环境

    由于是初学,本人又不懂英语,所以代码水平不高,但我个人使用的感觉还可以,也算是在Linux下搭建了一个简单的C语言IDE开发环境。于是就想“独乐乐,莫若众乐乐”,还是拿出来和大家分享一下吧!请行家们不要见笑。

    Linux下Eclipse调试C语言简介及环境配置

    这是关于Elclipse开发C语言的简单过程介绍

    动态分等级打印.Linux 程序开发打印 Debug 信息的使用技巧--C语言中几种输出调试信息的方法_精品文库_IThao12

    [摘要:Linux顺序开辟挨印Debug疑息的应用技能若何清楚明晰天挨印出顺序疑息,能够快速判别顺序运转环境,定位顺序出题目的中央。Linux 程序开发打印 D

    linux c gdb 调试工具

    linux C语言 程序开发 调试工具 linux下的编程少不了要debug,调试程序用

    嵌入式Linux应用程序开发详解(完整版)

    2.4 实验内容 本章小结 思考与练习 第3章 Linux下的C编程基础 3.1 Linux下 C语言编程概述 3.2 进入Vi 3.3 初探Emacs 3.4 Gcc编译器 3.5 Gdb调试器 3.6 Make工程管理器 3.7 使用autotools 3.8 ...

    Linux系统下C语言编程工具详细介绍

    本文介绍了在Linux下能用于C应用程序开发和调试的工具。本文的主旨是介绍如何在Linux下使用C编译器和其他C编程工具, 而非C语言编程的教程。在本文中你将学到以下知识: 什么是C、GNU C编译器、用gdb来调试GCC应用...

    linux局域网聊天工具(附带文档和源码参考)

    2.2 熟悉Linux操作系统下的C/C++应用程序开发环境,掌握linux系统下开发工具vi、gcc 和gdb的使用,以及makefile的写法; 2.3 掌握Linux环境下图形工具包GTK和网络编程中socket“套接字”的使用;

    Linux系统下C程序开发详解 电子教案.rar.

    非常适合C语言的初学读者、高校学生、程序开发人员、Linux工作人员阅读和学习。 内容包括: 第一部分 Linux基础篇 第1章 Linux编程平台 第2章 文本编辑器的使用 第二部分 Shell编程篇 第3章 Linux常用命令 第4...

    嵌入式Linux应用程序开发标准教程(第2版全)

    《嵌入式Linux应用程序开发标准教程(第2版)》主要分为3个部分,包括Linux基础、搭建嵌入式Linux环境和嵌入式Linux的应用开发。Linux基础部分从Linux基础、基本操作命令讲起,为Linux初学者能快速入门提供了保证。...

    LINUX应用程序开发指南:使用GTK+ GNOME库

    第一部分介绍Linux GUI编程架构以及编程基础知识,第二部分介绍Linux 编程常用C语言函数库glibc、构件库Gtk+、Gnome,第三部分介绍Linux下的GUI生成器Glade,第四部分介绍Linux编程调试工具gdb及xxgdb。第五部分包括...

    《精通LINUX C编程》书中源代码

    本书系统地介绍了在Linux操作系统下用C语言进行程序设计的方法,并通过列举大量的程序实例,使读者很快地掌握在Linux操作系统下进行C程序开发的方法和技巧,培养开发大型应用程序的能力。 本书内容主要包括Linux...

    linux c编程

    系统地介绍了在Linux操作系统下用C语言进行程序设计的方法,并通过列举大量的程序实例,使读者很快地掌握在Linux操作系统下进行C程序开发的方法和技巧,培养开发大型应用程序的能力。《精通Linux C编程》内容主要...

    LINUX应用程序开发指南:使用GTK+ GNOME库(文本PDF)

    第一部分介绍Linux GUI编程架构以及编程基础知识,第二部分介绍Linux 编程常用C语言函数库glibc、构件库Gtk+、Gnome,第三部分介绍Linux下的GUI生成器Glade,第四部分介绍Linux编程调试工具gdb及xxgdb。第五部分包括...

    linux C编程实战

     1.5 Linux下程序的开发环境和开发过程   1.6 习题   第2章 C编程基础、Vi和Emacs编辑器   2.1 C程序的结构   2.2 C语言的基本数据类型   2.2.1 整型   2.2.2 浮点型   2.2.3 字符型   2.3...

    Linux环境编程 实验3.doc

    根据实验指导书的要求和步骤,完成相应的程序开发及多模块软件编译与链接过程,并在Linux环境下,完成程序开发及软件剖析。 一、实验目的: 1)掌握MYSQL数据库命令与应用编程。 2)了解Linux多模块软件编译与链接...

    linux应用程序开发指南 使用gtk+ gnome库

    第一部分介绍Linux GUI编程架构以及编程基础知识,第二部分介绍Linux 编程常用C语言函数库glibc、构件库Gtk+、Gnome,第三部分介绍Linux下的GUI生成器Glade,第四部分介绍Linux编程调试工具gdb及xxgdb。第五部分包括...

    LINUX c语言开发技术完全手册

    编译与调试、c语言基础、c程序开发的常用语句、目录与文件、文件IO、网络编程、 无连接的套接字通信、面向连接的套接字通信......

    (光盘)MSP430单片机C语言应用程序设计实例精讲

    必须使用“Embedded Workbench”集成开发环境进行编译调试。 如果必须需要硬件支持的,则必须有硬件支持,才能进行运行。 光盘里面的电路图是用Protel99软件画成的,所以必须使用该 软件打开。 3. 系统要求 -----...

    Linux环境下段错误的产生原因及调试方法小结

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。借此机会系统...

Global site tag (gtag.js) - Google Analytics