linux下C编程详解

合集下载

Linux下C编程

Linux下C编程
第五章 Linux下C编程 Linux下
5.1 C语言简介 C语言简介
在80年代末期美国国家标准协会 80年代末期美国国家标准协会 (American National Standards Institute)发布了一个被称为ANSI C的 Institute)发布了一个被称为ANSI C的C 语言标准。这更加保证了将来在不同平台 上的C 上的C的一致性。 Linux上可用的C编译器是GNU C编译器, Linux上可用的C编译器是GNU C编译器, 它建立在自由软件基金会的编程许可证的 基础上,因此可以自由发布。你能在Linux 基础上,因此可以自由发布。你能在Linux 的发行光盘上找到它
5.3 用gdb调试GCC程序 gdb调试GCC程序
gdb是一个用来调试C C++程序的常用调 gdb是一个用来调试C和C++程序的常用调 试工具之一。 gdb所提供的一些功能: gdb所提供的一些功能: 监视程序中变量的值。 设置断点以使程序在指定的代码行上停止 执行。 逐行执行代码。 分析崩溃程序的产生的core文件 分析崩溃程序的产生的core文件
程序自动维护工具make 程序自动维护工具make
make是一种自动生成和维护目标程序的工具。 make是一种自动生成和维护目标程序的工具。 可以调用编译器、连接器等 根据程序各部分的修改情况,重新编译链接目 标代码 输入make命令后,系统自动检测系统文件和 输入make命令后,系统自动检测系统文件和 以定义的规则,完成整个创建过程
基本编译选项
-o选项 你能用 -o 编译选项来为将产生的可执行文件指 定一个文件名来代替 a.out。 a.out。 例:gcc 例:gcc –o count count.c -c选项:告诉GCC仅把源代码编译为目标代码而 选项:告诉GCC GCC仅把源代码编译为目标代码而 跳过汇编和连接的步骤。这个选项使用的非常频 繁,因为它使得编译多个C 繁,因为它使得编译多个C程序时速度更快并且 更易于管理。缺省时GCC建立的目标代码文件有 更易于管理。缺省时GCC建立的目标代码文件有 一个.o的扩展名。 一个.o的扩展名。 例:gcc 例:gcc –c test2.c

第三章Linux下的C编程

第三章Linux下的C编程

Emacs剪切和粘贴 剪切和粘贴
目录
目录内容
目录 M-k C-y
目录内容 剪切从光标位置到句 尾的内容
M剪切光标前的单词 Delete M-d C-k 剪切光标前的单词
剪切从光标位置到行尾 的单词
将缓冲区中的内容粘 贴到光标所在的位置 C-x u 撤销操作(先操作 C撤销操作( x,接着再单击 ) ,接着再单击u)
Vi编辑器 编辑器
Linux系统提供了一个完整的编译器家族系 系统提供了一个完整的编译器家族系 列:Ed,Ex,Vi和Emacs等;按功能它们 , , 和 等 可以分为两大类:行编辑器( , ) 可以分为两大类:行编辑器(Ed,Ex)和 全屏编辑器( , 全屏编辑器(Vi,Emacs)。 )。 行编辑器每次只能对一行进行操作。 行编辑器每次只能对一行进行操作。 全屏编辑器可以对整个屏幕进行编辑, 全屏编辑器可以对整个屏幕进行编辑,用 户编辑的文件直接显示在屏幕上,克服了 户编辑的文件直接显示在屏幕上, 行编辑的那种不知管的操作方式。 行编辑的那种不知管的操作方式。
注释: <chr>表示按住 表示按住Ctrl键的同时键入字符 键的同时键入字符<chr>,因此 因此, 注释:C-<chr>表示按住Ctrl键的同时键入字符<chr>,因此, C-f就表示按住Ctrl 键同时键入f。 就表示按住Ctrl 键同时键入f M-<chr>表示当键入字符<chr>时同时按住Alt键。 <chr>表示当键入字符 表示当键入字符<chr>时同时按住 键 时同时按住Alt
中保存文档的功能键为“ 在Emacs中保存文档的功能键为“C-x C中保存文档的功能键为 s”,这是在屏幕底下回出现 , “Wrote/root/workplace/editor/why”字 字 样。 Emacs有自动保存机制,自动保存的文件 有自动保存机制, 有自动保存机制 名前后都有一个“ , 名前后都有一个“#”,例如编辑名为 的文件, “hello.c”的文件,自动保存后为 的文件 “#hello.c#”.

linuxc编程基础内容

linuxc编程基础内容

linuxc编程基础内容Linux是一种开源的操作系统,广泛应用于各种计算机设备和嵌入式系统中。

在Linux系统中,C语言是一种常用的编程语言,被广泛用于开发各种应用程序和系统组件。

本文将介绍Linux C编程的基础内容,包括编译和运行C程序、变量和数据类型、控制流、函数和文件操作等方面的知识。

一、编译和运行C程序在Linux系统中,使用gcc编译器来编译C程序。

首先,我们需要创建一个以.c为扩展名的源代码文件,比如hello.c。

在文件中编写C程序代码,然后使用以下命令进行编译:gcc hello.c -o hello其中,hello.c是源代码文件的名字,-o hello表示将编译生成的可执行文件命名为hello。

编译成功后,可以使用以下命令来运行程序:./hello二、变量和数据类型在C语言中,我们可以定义各种类型的变量来存储不同种类的数据。

常见的数据类型包括整型、浮点型、字符型和指针类型等。

在Linux C编程中,我们可以使用int来表示整型变量,float或double来表示浮点型变量,char来表示字符型变量,以及void*来表示指针类型变量。

三、控制流控制流是指程序在执行过程中根据条件选择不同的执行路径。

在C 语言中,我们可以使用if语句、switch语句、for循环、while循环和do-while循环等结构来实现控制流。

这些结构可以帮助我们实现条件判断、循环执行和跳转等功能,从而实现复杂的程序逻辑。

四、函数函数是C语言中的重要概念,它可以将一段代码封装成一个可以重复使用的模块。

在Linux C编程中,我们可以通过函数来实现程序的模块化和结构化。

函数可以接受参数并返回一个值,也可以不接受参数或不返回值。

使用函数可以提高程序的可读性和可维护性。

五、文件操作在Linux系统中,文件操作是一种常见的需求。

C语言提供了一组用于文件操作的函数,包括打开文件、读取文件、写入文件和关闭文件等操作。

第3章 Linux下C编程

第3章 Linux下C编程
$(CC) $(OBJS) -o david kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c kang.c -o kang.o yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c yul.c -o yul.o
makefile变量
变量种类
libname.a),如果在编译某个程序时链接静态库,则链接器将会搜索静态库, 从中提取出它所需要的目标文件并直接拷贝到该程序的可执行二进制文件 (ELF格式文件)之中;
动态库(文件名格式为libname.so[.主版本号.次版本号.发行号])在
程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。
模式规则
模式规则是用来定义相同处理规则的多个文件的。它不同 于隐式规则,隐式规则仅仅能够用make默认的变量来进行 操作,而模式规则还能引入用户自定义变量,为多个文件 建立相同的规则,从而简化了makefile的编写
模式规则的格式类似于普通规则,这个规则中的相关文件 前必须用“%”标明
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g david : $(OBJS)
完成下列任务: (1)编写makefile文件,最终的目标文件为hello(交叉编译器为 arm-linux-gcc)
(2)给出程序编译执行步骤
第一步:编写makefile文件
hello: main.o list.o symbol.o table.o gcc main.o list.o symbol.o table.o -o hello
gcc编译器
3.3 gcc编译器
GCC(GNU Compiler Collection)是一套功能强大、性能 优越的编程语言编译器,它是GNU计划的代表作品之一。

C语言在Linux环境编程

C语言在Linux环境编程

C语言在Linux环境编程C语言是一种广泛使用的编程语言,而Linux作为一种开源的操作系统,提供了强大的开发环境和工具,使得C语言在Linux环境下编程成为了广大开发者的首选。

本文将探讨C语言在Linux环境下的编程特点及常用技巧。

一、Linux环境下的C语言开发工具在Linux环境下,开发者可以使用多种工具进行C语言的编程和调试。

其中,最常用的是gcc编译器和gdb调试器。

gcc是GNU Compiler Collection的缩写,它是一套基于GNU计划的开源编译器套件,支持多种编程语言,包括C语言。

gdb是GNU Debugger的缩写,它是一个功能强大的调试器,可以帮助开发者定位和修复程序的错误。

二、C语言在Linux环境下的编写风格在Linux环境下编写C语言程序时,程序员通常采用一些特定的编写风格和规范,以便提高代码的可读性和可维护性。

以下是一些常用的编写风格:1. 缩进:使用适当的缩进来使代码结构清晰,建议使用4个空格或一个制表符进行缩进。

2. 命名规范:变量、函数和常量的命名应具有一定的描述性,遵循驼峰命名法或下划线命名法。

3. 注释:在代码中添加必要的注释,解释代码的作用和设计意图,以便其他人能够理解和维护代码。

4. 模块化:将程序分解为多个小模块,每个模块负责一个特定的功能,提高代码的可复用性和可测试性。

三、Linux环境下的C语言编译与运行在Linux环境下,通过gcc编译器可以将C语言源代码编译成可执行文件。

编译C语言程序的基本命令是:gcc source.c -o output其中,source.c是源代码文件的名称,-o是选项,用于指定生成的可执行文件的名称,output是可执行文件的名称。

编译成功后,可以使用以下命令来运行程序:./output四、Linux环境下的C语言调试在Linux环境下,使用gdb调试器可以帮助开发者定位和修复程序的错误。

以下是一些常用的调试技巧:1. 加入调试信息:在编译时,可以使用-g选项来生成包含调试信息的可执行文件,以便在调试过程中更容易定位错误。

请简述linux环境下c程序的编译执行过程。

请简述linux环境下c程序的编译执行过程。

请简述linux环境下c程序的编译执行过程。

在Linux环境下,C程序的编译执行过程包括预处理、编译、汇编、链接和执行五个步骤。

下面将会对每个步骤进行详细的说明。

1.预处理:预处理是在编译前对源代码进行处理的阶段。

预处理器将执行一系列操作,包括宏展开、头文件包含、条件编译等。

预处理的结果是生成一个经过处理的输出文件,通常是一个带有".i"扩展名的文件,也称为预处理文件。

在Linux环境下可以使用以下命令对源文件进行预处理:```bashgcc -E source.c -o output.i```2.编译:编译是将预处理文件转换为汇编代码的阶段。

编译器将预处理文件作为输入,对其进行词法分析、语法分析和语义分析,并将其转换成汇编代码。

编译的结果是一个带有".s"扩展名的文件,也称为汇编代码文件。

```bashgcc -S output.i -o output.s```3.汇编:汇编是将汇编代码转换为机器码的阶段。

汇编器将汇编代码作为输入,将其转换为二进制机器指令,生成一个带有".o"扩展名的目标文件(也称为目标代码文件)。

在Linux环境下可以使用以下命令将汇编代码转换为目标代码:```bashgcc -c output.s -o output.o```4.链接:链接是将目标文件与库文件进行合并,并解析所有的外部符号引用的过程。

链接器将目标文件作为输入,将其与系统库文件和用户库文件合并,生成一个可执行文件。

链接的结果是一个可执行文件,没有扩展名。

```bashgcc output.o -o executable```5.执行:执行是将可执行文件加载到内存中,并运行程序的过程。

操作系统将可执行文件加载到内存中的进程空间,然后执行程序的入口点,开始运行程序。

程序会根据代码的逻辑执行相应的操作,最终会得到预期的结果。

除了以上的基本编译执行过程外,还可以使用Makefile来管理项目的编译过程。

Linux下的C语言编程-基础知识

Linux下的C语言编程-基础知识

Linux下的C语言编程--基础知识篇前言:这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容:源程序编译Makefile的编写程序库的链接程序的调试头文件和系统求助--------------------------------------------------------------------------------1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):int main(int argc,char **argv){printf("Hello Linux\n");}要编译这个程序,我们只要在命令行下执行:gcc -o hello hello.cgcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.2.Makefile的编写假设我们有下面这样的一个程序,源代码如下:/* main.c */#include "mytool1.h"#include "mytool2.h"int main(int argc,char **argv){mytool1_print("hello");mytool2_print("hello");}/* mytool1.h */#ifndef _MYTOOL_1_H#define _MYTOOL_1_Hvoid mytool1_print(char *print_str);#endif/* mytool1.c */#include "mytool1.h"void mytool1_print(char *print_str){printf("This is mytool1 print %s\n",print_str);}/* mytool2.h */#ifndef _MYTOOL_2_H#define _MYTOOL_2_Hvoid mytool2_print(char *print_str);#endif/* mytool2.c */#include "mytool2.h"void mytool2_print(char *print_str){printf("This is mytool2 print %s\n",print_str);}当然由于这个程序是很短的我们可以这样来编译gcc -c main.cgcc -c mytool1.cgcc -c mytool2.cgcc -o main main.o mytool1.o mytool2.o这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是:# 这是上面那个程序的Makefile文件main:main.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c main.cmytool1.o:mytool1.c mytool1.hgcc -c mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c mytool2.c有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.下面我们学习Makefile是如何编写的.在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是:target: componentsTAB rule第一行表示的是依赖关系.第二行是规则.比如说我们上面的那个Makefile文件的第二行main:main.o mytool1.o mytool2.o表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:# 这是简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^main.o:main.c mytool1.h mytool2.hgcc -c $<mytool1.o:mytool1.c mytool1.hgcc -c $<mytool2.o:mytool2.c mytool2.hgcc -c $<经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile的缺省规则.c.o:gcc -c $<这个规则表示所有的 .o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c这样Makefile还可以变为:# 这是再一次简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^.c.o:gcc -c $<好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档.3.程序库的链接试着编译下面这个程序/* temp.c */#includeint main(int argc,char **argv){double value;printf("Value:%f\n",value);}这个程序相当简单,但是当我们用 gcc -o temp temp.c 编译时会出现下面所示的错误./tmp/cc33Kydu.o: In function `main':/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log'collect2: ld returned 1 exit status出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了使用数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc 编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的 -L选项指定路径.比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上 -L/home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径.还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm -o/lib/*.so|grep sin>~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm). 如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢!4.程序的调试我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了.最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入 -g选项.关于gdb的使用可以看gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一个用.5.头文件和系统求助有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统.比如说我们想知道fread这个函数的确切形式,我们只要执行 man fread 系统就会输出着函数的详细解释的.和这个函数所在的头文件说明了. 如果我们要write这个函数的说明,当我们执行man write时,输出的结果却不是我们所需要的. 因为我们要的是write这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用 man 2 write. 2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数.记住不管什么时候,man都是我们的最好助手.。

linux c 编程介绍

linux c 编程介绍

Linux c 编程介绍一:编译及调试1.1编译Linux 是一种类UNIX系统,C编译器是传统的UNIX中的标准组件,尤其是在开源的类UNIX中。

Linux分发版中包含了GNU C(gcc)和GNU C++(g++)两个编译器,分别用于C和C++原程序的编译。

gcc格式:gcc –cv [-o filename][-pg]filenamegcc用于编译一个或多个文件中的C代码,并生成目标模块或可执行文件。

C原代码文件应以”.c”为扩展名。

-c用于生成目标模块,等待以后连接。

-o指明生成可执行文件的文件名。

-pg用于生成分析数据。

(hello.c)int main(int argc,char **argv){printf(“Hello Linux\n”);}只需要用gcc -o hello hello.c(-o表示要生成的文件名,默认从a1开始)如果要引用一些库则需要如下命令:LIB = -L/usr/local/libINCLUDE = -I/usr/local/include/LIBS = -lxml2 -lrtp –lexosip2这个-L 和-I 开关告诉编译器和链接分别在哪里找到library 和include 文件。

在这个例子里,xml2、rtp、exosip2 库应该在/usr/local/lib 目录,且它们包含的头文件应该在/usr/local/include/目录里。

1.2 链接在编译时候经常会出现collect2: ld returned 1 exit status这样的连接错误,在编译时候找不到相应函数的具体实现,虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库。

比如调用xml2库中相关函数需要-lxml2来指定引用xml2库,引用数学函数需要-lm来指定引用了math库。

对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了。

linux下C编程详解

linux下C编程详解

1)Linux程序设计入门--基础知识Linux下C语言编程基础知识前言:这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容:源程序编译Makefile的编写程序库的链接程序的调试头文件和系统求助--------------------------------------------------------------------------------1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):int main(int argc,char **argv){printf("Hello Linux ");}要编译这个程序,我们只要在命令行下执行:gcc -o hello hello.cgcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.2.Makefile的编写假设我们有下面这样的一个程序,源代码如下:/* main.c */#include "mytool1.h"#include "mytool2.h"int main(int argc,char **argv){mytool1_print("hello");mytool2_print("hello");}/* mytool1.h */#ifndef _MYTOOL_1_H#define _MYTOOL_1_Hvoid mytool1_print(char *print_str);#endif/* mytool1.c */#include "mytool1.h"void mytool1_print(char *print_str){printf("This is mytool1 print %s ",print_str);}/* mytool2.h */#ifndef _MYTOOL_2_H#define _MYTOOL_2_Hvoid mytool2_print(char *print_str);#endif/* mytool2.c */#include "mytool2.h"void mytool2_print(char *print_str){printf("This is mytool2 print %s ",print_str);}当然由于这个程序是很短的我们可以这样来编译gcc -c main.cgcc -c mytool1.cgcc -c mytool2.cgcc -o main main.o mytool1.o mytool2.o这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是:# 这是上面那个程序的Makefile文件main:main.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c main.cmytool1.o:mytool1.c mytool1.hgcc -c mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c mytool2.c有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.下面我们学习Makefile是如何编写的.在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是:target: componentsTAB rule第一行表示的是依赖关系.第二行是规则.比如说我们上面的那个Makefile文件的第二行main:main.o mytool1.o mytool2.o表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行gcc -o main main.o mytool1.o mytool2.o注意规则一行中的TAB表示那里是一个TAB键Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:# 这是简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^main.o:main.c mytool1.h mytool2.hgcc -c $<mytool1.o:mytool1.c mytool1.hgcc -c $<mytool2.o:mytool2.c mytool2.hgcc -c $<经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile的缺省规则..c.o:gcc -c $<这个规则表示所有的.o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c 这样Makefile还可以变为:# 这是再一次简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^..c.o:gcc -c $<好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档.3.程序库的链接试着编译下面这个程序/* temp.c */#include <math.h>;int main(int argc,char **argv){double value;printf("Value:%f ",value);}这个程序相当简单,但是当我们用gcc -o temp temp.c 编译时会出现下面所示的错误./tmp/cc33Kydu.o: In function `main':/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log'collect2: ld returned 1 exit status出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了使用数学函数,我们必须和数学库连接,为此我们要加入-lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的-L选项指定路径.比如说我们有一个库在/home/hoyt/mylib下,这样我们编译的时候还要加上-L/h ome/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径.还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libp thread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用nm -o /lib/*.so|grep sin>;~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在libm-2.1.2.so库里面,我用-lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是-lm). 如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢!4.程序的调试我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了.最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入-g选项.关于gdb的使用可以看gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一个用.5.头文件和系统求助有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统.比如说我们想知道fread这个函数的确切形式,我们只要执行man fread 系统就会输出着函数的详细解释的.和这个函数所在的头文件<stdio.h>;说明了. 如果我们要write这个函数的说明,当我们执行man write时,输出的结果却不是我们所需要的. 因为我们要的是w rite这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用man 2 write. 2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数.记住不管什么时候,man都是我们的最好助手.------------------------------------------------------------------------好了,这一章就讲这么多了,有了这些知识我们就可以进入激动人心的Linux下的C程序探险活动.2)Linux程序设计入门--进程介绍Linux下进程的创建前言:这篇文章是用来介绍在Linux下和进程相关的各个概念.我们将会学到:进程的概念进程的身份进程的创建守护进程的创建--------------------------------------------------------------------------------1。

linux编写c代码

linux编写c代码

linux编写c代码1.简介:Linux是一款基于Unix的操作系统,其开放源代码和高度可定制性使其成为开发人员和系统管理员的首选平台之一。

本文将介绍如何在Linux平台上编写C代码。

2. 安装编译器:在Linux上编写C代码需要先安装编译器。

常用的编译器有GCC和Clang。

在终端中输入命令“sudo apt-get install build-essential”可以安装GCC编译器。

3. 新建C文件:在终端中进入代码存储文件夹,输入命令“vim filename.c”新建一个C代码文件。

在Vim编辑器中,按下“i”键可以进入编辑模式。

4. 编写C代码:C代码是由函数、变量和语句构成的。

以下是一个简单的“Hello World”程序的例子:#include <stdio.h>int main() {printf('Hello World!');return 0;}代码中包含了一个头文件<stdio.h>和一个函数“printf”,它用于在终端中输出一条信息。

5. 编译代码:在终端中输入命令“gcc filename.c -o filename”来编译代码。

编译后会生成一个可执行文件。

6. 运行代码:在终端中输入命令“./filename”来运行代码。

程序将在终端中输出“Hello World!”这条信息。

7. 调试C代码:在编写C代码时难免会出现错误。

可以使用GDB 调试工具来定位和解决问题。

在终端中输入命令“gcc -g filename.c -o filename”来编译带有调试符号的代码。

然后在终端中输入命令“gdb filename”来启动GDB。

在GDB中可以使用各种命令来查看代码、变量和调用栈等信息,帮助我们找到问题的根源。

总结:在Linux上编写C代码需要安装编译器、新建C文件、编写C代码、编译代码和运行代码。

使用GDB调试工具可以快速定位和解决代码问题。

第3章linux下C编程基础

第3章linux下C编程基础

gcc --汇编阶段
汇编阶段把编译阶段生成的汇编程序.s转成目 标文件.o,使用-c选项,可以把汇编程序转换 成二进制目标代码。
[root@localhost gcc]# gcc –c hello.s –o hello.o
gcc—链接阶段
把目标代码链接起来,转换成为可执行文件。 [root@localhost gcc]# gcc hello.o –o hello 有个重要概念:函数库。程序中没有定义 printf函数,stdio.h中也只是printf的声明, printf在哪里呢?事实上,该函数的实现在名 字为libc.so.6的库文件当中,该库文件在 /usr/lib目录下,没有特别指定,gcc会自动到 该目录下搜索库文件。该库是动态库。
编译选项
-static:静态连接库文件 例如:gcc –static hello.c –o hello -shared:共享库文件,库有共享和静态两种:共享通 常用.so为后缀,静态用.a为后缀。
当使用静态库时,连接器找出程序所需的函数,然后将 它拷贝到可执行文件,一旦连接成功,静态程序库也就 不再需要了。 共享库在执行程序内留下一个标记,指明当程序执行时, 首先必须载入这个库,由于共享库节省空间,linux进行 连接的缺省是首先连接共享库。
基本用法
Gcc最基本的用法是:
gcc [选项] 要编译的文件 [选项] [目标文件] 目标文件可以缺省,默认生成的可执行文件命 名为:a.out
gcc编译选项大约有100多个,其中多数我们不常用, 这里介绍其中最基本、最常用的参数。
总体选项 告警选项 优化选项 体系结构相关选项 选项由-和字母组成,如-c、-o等。
GDB命令

linux 下c 程序的编写、编译与运行方法

linux 下c 程序的编写、编译与运行方法

linux 下c 程序的编写、编译与运行方法摘要:1. Linux 下的C 语言编程环境搭建2.C 程序的编写方法3.C 程序的编译与运行方法4.实用技巧与注意事项正文:**一、Linux 下的C 语言编程环境搭建**在Linux 系统中,我们可以使用自带的编译器(如GCC)进行C 语言编程。

首先,确保系统已安装了GCC 编译器。

可以通过以下命令进行检查:```bashgcc --version```如果未安装,可以使用以下命令进行安装:```bashsudo apt-get install gcc```**二、C 程序的编写方法**1.使用文本编辑器编写代码,如Vim、Emacs 等。

2.编写代码时,注意使用宏定义和预处理指令,如`#include`、`#define` 等。

3.编写完代码后,保存文件为 .c 扩展名,例如:`main.c`。

**三、C 程序的编译与运行方法**1.使用`gcc` 编译器编译C 程序。

编译命令格式如下:```bashgcc [options] filename.c -o output_file```其中,[options] 是编译选项,如优化选项`-O2`、禁用调试信息`-g` 等。

output_file 是编译后的可执行文件名。

例如,编译并生成名为`hello` 的可执行文件:```bashgcc main.c -o hello```2.运行编译后的可执行文件。

运行命令如下:```bash./output_file```例如,运行刚刚编译的`hello` 程序:```bash./hello```**四、实用技巧与注意事项**1.使用`gcc` 编译器时,可以利用`-Wall` 选项显示所有警告信息,以便更好地调试代码。

2.使用`gdb` 调试器进行程序调试,熟练掌握`gdb` 的基本命令,如`run`、`backtrace`、`print` 等。

3.注意代码格式和缩进,遵循Linux 风格规范。

Linux系统下C语言编程及技巧研究

Linux系统下C语言编程及技巧研究

Linux系统下C语言编程及技巧研究Linux是一种自由和开放源代码的类Unix操作系统,广泛用于服务器领域。

同时,Linux系统也是许多开发者和程序员首选的开发环境。

因此,掌握在Linux系统下C语言编程及技巧非常重要。

本文将重点介绍在Linux下进行C语言编程的一些技巧和要点。

1. GNU编译器工具集(GCC)GCC是 GNU编译器工具集的简称,支持多种编程语言,如C、C++、Objective-C、Java等。

在Linux系统下,GCC是编译C程序的主要工具。

开发者可以通过命令行或集成式开发环境(IDE)使用GCC。

2. 环境变量环境变量是Linux系统的重要概念,能够帮助开发者方便地访问系统资源和软件库。

开发者可以通过设置环境变量,指定GCC的默认搜索路径和库路径。

例如,下列命令可将环境变量C_INCLUDE_PATH设置为当前目录:export C_INCLUDE_PATH=.3. 头文件头文件在C语言程序的编写过程中是非常重要的。

Linux系统提供了许多C语言头文件,例如stdio.h、stdlib.h等。

开发者也可以根据需求编写自己的头文件。

在编写程序时,一定要正确地包含头文件。

否则编译器将无法识别预定义的类型和函数。

例如,下列程序演示了如何使用stdio.h头文件中的printf函数:4. 动态链接库动态链接库(Dynamic Linking Libraries,DLL)提供了跨多个程序共享函数和代码的能力。

在Linux系统下,动态链接库通常以.so文件形式出现。

开发者可以通过指定链接器选项使用动态链接库。

例如,下列命令将可执行文件myprog连接到数学库libm.so:gcc -o myprog myprog.c -lm5. 调试器调试器是程序员的重要工具。

调试器能够帮助开发者在程序崩溃或产生错误时追踪问题。

在Linux系统下,调试器gdb(GNU调试器)是普遍使用的工具。

例如,下列命令启动了gdb并加载了可执行文件:gdb ./myprog在gdb命令行下,可以执行多种命令来分析程序的行为,如查看变量的值、单步执行代码、设置断点等。

LINUXC编程

LINUXC编程

LINUXC编程Linux C编程是指在Linux系统下使用C语言进行开发和编程的过程。

Linux操作系统是一种开源操作系统,它具有高度的稳定性和可靠性,被广泛应用于嵌入式系统、服务器等领域。

而C语言是一种通用的高级编程语言,它能够以高效的方式进行系统级编程和底层开发。

因此,Linux C编程是一门非常重要的技术,并且在软件开发中起着重要的作用。

一、Linux C编程的基础知识1. Linux系统的特点:Linux是一种开源操作系统,它具有高度的稳定性、安全性和可靠性。

Linux系统使用C语言进行开发,同时还支持其他编程语言。

2. C语言的基础知识:C语言是一种通用的高级编程语言,它是以过程化的方式进行编程。

C语言具有简洁、易读、高效的特点,因此在Linux系统下使用C语言进行开发是非常合适的。

3. 开发环境的搭建:在进行Linux C编程之前,需要搭建好相应的开发环境。

常用的开发环境有GCC编译器、GNU调试器(GDB)等。

4. 基本的编程技巧:在进行Linux C编程时,需要掌握一些基本的编程技巧,例如使用makefile进行程序编译、调试程序等。

二、Linux C编程的常用功能和技术1. 进程管理:Linux是一种多进程的操作系统,因此在Linux C编程中需要掌握进程的创建、销毁、切换等操作。

2. 文件操作:Linux系统下的文件操作是一种常见的编程任务。

在Linux C编程中,可以使用标准C库提供的文件操作函数进行文件的打开、读写、关闭等操作。

3. 网络编程:网络编程是一项重要的技术。

在Linux C编程中,可以使用套接字(socket)进行网络连接、数据传输等操作。

4. 并发编程:Linux系统支持多线程编程和进程间通信(IPC)等机制,因此在Linux C编程中可以使用多线程和IPC进行并发编程。

5. 内存管理:在Linux C编程中,需要正确地进行内存分配和释放,以避免内存泄漏和内存溢出等问题。

第3章 Linux下C编程基础

第3章  Linux下C编程基础
/* hello.i */ …… typedef int (*__gconv_trans_fct) (struct __gconv_step *, struct __gconv_step_data *, void *, __const unsigned char *, __const unsigned char **, __const unsigned char *, unsigned char **, size_t *); …… # 2 "hello.c" 2 int main() { printf("Hello! This is our embedded world!\n"); return 0; }



<b>移动到当前单词的开始 <e>移动到当前单词的结尾 <w>向前移动一个单词 <h>向前移动一个字符 <j>向上移动一行 <k>向下移动一行 <l>向后移动一个字符
vi用法 --- 替换操作



<r>替换光标所在的字符 <R>替换字符序列 <cw>替换一个单词 <ce>同<cw> <cb>替换光标所在的前一字符 <c$>替换自光标位置至行尾的所有字符 <C>同<c$> <cc>替换当前行
(2)编译链接器 编译是指源代码转化生成可执行代码的过程, 它所完成工作主要如图 3.1 所示。 可见,在编译过程是非常复杂的,它包括词法、 语法和语义的分析、中间代码的生成和优化、符 号表的管理和出错处理等。在 Linux 中,最常用 的编译器是 Gcc 编译器。它是 GNU推出的功能强 大、性能优越的多平台编译器,其执行效率与一 般的编译器相比平均效率要高20%~30%,堪称为 GNU 的代表作品之一。

第五讲 Linux下C编程基础

第五讲 Linux下C编程基础
显示函数名为function的函数的源程序。 list 显示当前行后面的源程序。 list 显示当前行前面的源程序。
2.断点的设定与清除 设定断点(指令为 break,可简写为 (b),格式计有: (gdb) break filename.c:30 => 在 filename.c 的第三十行处停止执 行。 (gdb) break function => 在进入 function 时中断程序的执行。 (gdb) break filename.c:function => 在程序代码档 filename.c 中 的函数 function 处设定断点。 (gdb) break => 在下一个将被执行的命令设定断点。 (gdb) break ... if cond => 只有当 cond 成立的时候才中断。cond 须以 C 语言的语法写成。
LINUX包含了一个叫gdb的GNU调试程序。gdb是 一个用来调试C和C++程序的强有力调试器。它使你 能在程序运行时观察程序的内部结构和内存的使用 情况。它具有以下一些功能:
• 监视程序中变量的值;
• 设置断点以使程序在指定的代码行上停止执行; • 一行行的执行代码。
1. gdb的使用方法:
gdb [option] [executable-file[core-file or process-id]
3.GNU调试程序gdb
1.应用举例 (1)设有一源程序 greet.c (2)编译,gcc -ggdb –o greet greet.c,出错 (3)gdb greet ,出现提示符 (gdb) 此时可在提示符下输入gdb的命令了,如: (gdb) run (gdb) list (4)退出调试状态,返回系统提示符下, (gdb)quit
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1)Linux程序设计入门--基础知识Linux下C语言编程基础知识前言:这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容:源程序编译Makefile的编写程序库的链接程序的调试头文件和系统求助--------------------------------------------------------------------------------1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器.假设我们有下面一个非常简单的源程序(hello.c):int main(int argc,char **argv){printf("Hello Linux ");}要编译这个程序,我们只要在命令行下执行:gcc -o hello hello.cgcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.2.Makefile的编写假设我们有下面这样的一个程序,源代码如下:/* main.c */#include "mytool1.h"#include "mytool2.h"int main(int argc,char **argv){mytool1_print("hello");mytool2_print("hello");}/* mytool1.h */#ifndef _MYTOOL_1_H#define _MYTOOL_1_Hvoid mytool1_print(char *print_str);#endif/* mytool1.c */#include "mytool1.h"void mytool1_print(char *print_str){printf("This is mytool1 print %s ",print_str);}/* mytool2.h */#ifndef _MYTOOL_2_H#define _MYTOOL_2_Hvoid mytool2_print(char *print_str);#endif/* mytool2.c */#include "mytool2.h"void mytool2_print(char *print_str){printf("This is mytool2 print %s ",print_str);}当然由于这个程序是很短的我们可以这样来编译gcc -c main.cgcc -c mytool1.cgcc -c mytool2.cgcc -o main main.o mytool1.o mytool2.o这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是:# 这是上面那个程序的Makefile文件main:main.o mytool1.o mytool2.ogcc -o main main.o mytool1.o mytool2.omain.o:main.c mytool1.h mytool2.hgcc -c main.cmytool1.o:mytool1.c mytool1.hgcc -c mytool1.cmytool2.o:mytool2.c mytool2.hgcc -c mytool2.c有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的.下面我们学习Makefile是如何编写的.在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是:target: componentsTAB rule第一行表示的是依赖关系.第二行是规则.比如说我们上面的那个Makefile文件的第二行main:main.o mytool1.o mytool2.o表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行gcc -o main main.o mytool1.o mytool2.o注意规则一行中的TAB表示那里是一个TAB键Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:# 这是简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^main.o:main.c mytool1.h mytool2.hgcc -c $<mytool1.o:mytool1.c mytool1.hgcc -c $<mytool2.o:mytool2.c mytool2.hgcc -c $<经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile的缺省规则..c.o:gcc -c $<这个规则表示所有的.o文件都是依赖与相应的.c文件的.例如mytool.o依赖于mytool.c 这样Makefile还可以变为:# 这是再一次简化后的Makefilemain:main.o mytool1.o mytool2.ogcc -o $@ $^..c.o:gcc -c $<好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile规则可以查看相应的文档.3.程序库的链接试着编译下面这个程序/* temp.c */#include <math.h>;int main(int argc,char **argv){double value;printf("Value:%f ",value);}这个程序相当简单,但是当我们用gcc -o temp temp.c 编译时会出现下面所示的错误./tmp/cc33Kydu.o: In function `main':/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log'collect2: ld returned 1 exit status出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了使用数学函数,我们必须和数学库连接,为此我们要加入-lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的-L选项指定路径.比如说我们有一个库在/home/hoyt/mylib下,这样我们编译的时候还要加上-L/h ome/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径.还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libp thread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用nm -o /lib/*.so|grep sin>;~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在libm-2.1.2.so库里面,我用-lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是-lm). 如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢!4.程序的调试我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了.最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入-g选项.关于gdb的使用可以看gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. 不过我不喜欢用gdb.跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一个用.5.头文件和系统求助有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统.比如说我们想知道fread这个函数的确切形式,我们只要执行man fread 系统就会输出着函数的详细解释的.和这个函数所在的头文件<stdio.h>;说明了. 如果我们要write这个函数的说明,当我们执行man write时,输出的结果却不是我们所需要的. 因为我们要的是w rite这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用man 2 write. 2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数.记住不管什么时候,man都是我们的最好助手.------------------------------------------------------------------------好了,这一章就讲这么多了,有了这些知识我们就可以进入激动人心的Linux下的C程序探险活动.2)Linux程序设计入门--进程介绍Linux下进程的创建前言:这篇文章是用来介绍在Linux下和进程相关的各个概念.我们将会学到:进程的概念进程的身份进程的创建守护进程的创建--------------------------------------------------------------------------------1。

相关文档
最新文档