第2章 Linux 下C 编程基础_第1页
第2章 Linux 下C 编程基础_第2页
第2章 Linux 下C 编程基础_第3页
第2章 Linux 下C 编程基础_第4页
第2章 Linux 下C 编程基础_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2024/1/24Page1第2章Linux环境下C语言的开发

Linux和C语言有很深的渊源,因为Linux本身就是用C语言编写的。在Linux操作系统中也提供了C语言的开发环境。这些开发环境一般包括:程序生成工具;程序调试工具;工程管理工具。本章介绍Linux环境下C语言开发的相关知识。

2024/1/24Page2第2章Linux环境下C语言的开发

C语言简单回顾2.1Linux程序设计基础知识

2.2Linux下的C语言开发环境*2.3嵌入式LinuxC语言开发流程和开发工程*2.42024/1/24Page32.1C语言简单回顾

C语言最早是由贝尔实验室的DennisRitchie为了UINX的辅助开发而编写的,它是在B语言的基础上开发出来的。尽管C语言不是专门针对UNIX操作系统或机器编写的,但是它与UNIX的关系十分紧密。2024/1/24Page4第2章Linux环境下C语言的开发

嵌入式Linux中程序的运行原理2.5Linux程序设计的特点2.6Linux下的C语言编码的风格2.7本章小结2.8

思考与练习2.92024/1/24Page52.1C语言简单回顾

1987年,随着微型计算机的日益普及,出现了许多C语言版本。由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准,成为现行的标准C语言的主要特点。2024/1/24Page62.1C语言简单回顾

1990年,国际化标准组织ISO(IntrernationalStandardOrganization)接受了87ANSIC为ISOC的标准(ISO9899-1990)。 1994年,ISO修订了C语言的标准。目前流行的C语言编译系统大多是以ANSIC为基础进行开发的,但不同版本的C编译系统说实现的语言功能和语法规则有略有差别。2024/1/24Page72.1C语言简单回顾

C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画,它是数值计算的高级语言。由于它的硬件无关性和可移植性,使得C语言逐渐成为世界上使用最广泛的语言。2024/1/24Page82.1C语言简单回顾

C语言的特点如下:

1.简洁紧凑、灵活方便 2.运算符丰富 3.数据结构丰富 4.C是结构式语言 5.C语法限制不太严格、程序设计自由度大2024/1/24Page92.1C语言简单回顾

6.允许直接访问物理地址,直接操作硬件 7.程序执行效率高 8.可移植性好

2024/1/24Page102.1C语言简单回顾

C语言有一个突出的优点就是适合于多种操作系统,如DOS、UNIX,也适用于多种机型。 C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。2024/1/24Page112.2Linux程序设计基础知识2.2.1程序安装目录

1、Linux下程序通常保存在专门的目录里系统软件可以在/usr/bin子目录里找到;系统管理员为某个特定的主机系统或本地网络添加的应用程序可以在/usr/local/bin子目录里找到。

2024/1/24Page122.2Linux程序设计基础知识2、Linux系统中典型的应用程序由以下几部分组成: 普通执行程序文件(/usr/bin) 服务器执行程序文件和管理程序文件(/usr/sbin) 应用程序配置文件(/etc) 应用程序文档手册文件(/usr/share/doc/) 应用程序手册页文件(/usr/share/man/)

2024/1/24Page132.2Linux程序设计基础知识3、系统管理员一般使用/usr/local子目录,该目录可以把供应商提供的文件和后来添加的程序以及系统本身提供的程序隔离开。

2024/1/24Page142.2Linux程序设计基础知识2.2.2头文件

glibc_header是Linux下的系统头文件,如果缺少系统头文件,很多用到系统功能的C程序将无法编译。1、在使用C语言和其他语言进行程序设计时,需要头文件来提供对常数的定义和对系统函数及库函数的调用的声明。2024/1/24Page152.2Linux程序设计基础知识2、对C语言来说,头文件的保存位置:/usr/include:系统头文件/usr/local/include:本地头文件2024/1/24Page162.2Linux程序设计基础知识3、在调用C语言编译器时,可以通过-I编译命令标志来引用保存在下级子目录或者非标准位置的头文件。例如:/root/test/include/include-test.h/root/test/include/include-test.c当前路径/root/test,源文件中使用#include<include-test.h>,则编译命令gcc如何写?

解答:gcc–I/root/test/include-cinclude-test.c或gcc–Iinclude-cinclude-test.c问题:如果源文件中使用#include“include/include-test.h”或#include“/root/test/include/include-test.h”,则编译命令gcc如何写?2024/1/24Page172.2Linux程序设计基础知识

inux常用头文件如下所示:2024/1/24Page182.2Linux程序设计基础知识2.2.3库文件

库文件是一些预先编译好的函数的集合,这些函数都是按照可再使用的原则编写的。这些函数通常由一组相互关联的用来完成某项常见工作的函数构成。

库文件与头文件关系:1、头文件中有函数的申明,库文件实现函数的定义,库文件一般是以二进制形式而不是C源文件形式。2、库文件通过头文件向外导出接口。用户通过头文件找到库文件中函数实现的代码从而把这段代码链接到用户程序中去。

2024/1/24Page192.2Linux程序设计基础知识

1、库文件必须遵守一定的命名规则lib开头+库名称+扩展名注意:库文件的名字总是以lib开头,随后的部分指明这是什么库比如:libm就代表了数学库文件名的扩展名部分以“.”开始,可以是“.a”或“.so”2024/1/24Page202.2Linux程序设计基础知识

2、库文件的类型有以下形式.a——(Archive)静态函数库应用程序编译时从静态库中直接拷贝函数到二进制映像文件,编译后的可执行程序较大,但执行较快,体现为“空间换时间”.so——(ShareObject)共享函数库(动态库)可执行文件在运行时将函数代码从共享库文件中读出,既动态链接,从而间接引用。编译后的可执行程序较小,但执行较慢,体现为“时间换空间”2024/1/24Page212.2Linux程序设计基础知识

3、库函数的基本路径 编译时要告诉C语言编译器(链接程序)应该去查找哪些库文件。默认情况下,它只会查找C语言的标准库文件。/lib:系统必备共享库。 /usr/lib:标准共享库和静态库。 /usr/local/lib:本地函数库。 /usr/i486-Linux-libc5/lib:libc5兼容性函数库。 /usr/XIIR6/lib:XIIR6函数库。2024/1/24Page222.2Linux程序设计基础知识4、库文件的搜索顺序如下:

(1)首先在“LD_LIBRARY_PATH”环境变量所设置的路径下查找; (2)搜索动态加载器在/etc目录下的缓存文件/etc/ld.so.cache。2024/1/24Page232.2Linux程序设计基础知识5、例题:创建静态库和动态库

创建静态库步骤:(1)编写库的头文件及库的实现文件(2)编译生成各目标文件(3)用ar文件对目标文件归档,生成静态库文件。(4)使用生成的静态库2024/1/24Page242.2Linux程序设计基础知识(1)编写库的头文件myalib.h及库的实现文件myalib.c//myalib.h

#inlcude<stdio.h>voidtest(){

printf("testresult\n");}voidtest();//myalib.c

2024/1/24Page252.2Linux程序设计基础知识5、例题:创建静态库和动态库

创建静态库步骤:(1)编写库的头文件及库的实现文件(2)编译生成各目标文件(3)用ar文件对目标文件归档,生成静态库文件。(4)使用生成的静态库2024/1/24Page262.2Linux程序设计基础知识(2)编译生成各目标文件

gcc-cmyalib.cmyalib.h

myalib.c

myalib.o执行完后会生成一个目标文件myalib.o2024/1/24Page272.2Linux程序设计基础知识5、例题:创建静态库和动态库

创建静态库步骤:(1)编写库的头文件及库的实现文件(2)编译生成各目标文件(3)用ar文件对目标文件归档,生成静态库文件。(4)使用生成的静态库2024/1/24Page282.2Linux程序设计基础知识(3)用ar文件对目标文件归档,生成静态库文件ar-rcs

libtest.a

myalib.o注意:r表明将模块加入到静态库中;c表示创建静态库;s表示生成索引。

库文件名一定要以lib打头,.a结尾myalib.h

myalib.c

myalib.o

libtest.a执行完后会生成一个静态库文件libtest.a2024/1/24Page292.2Linux程序设计基础知识5、例题:创建静态库和动态库

创建静态库步骤:(1)编写库的头文件及库的实现文件(2)编译生成各目标文件(3)用ar文件对目标文件归档,生成静态库文件。(4)使用生成的静态库2024/1/24Page302.2Linux程序设计基础知识(4)使用生成的静态库gcc-I./-cmain.c#Include<myalib.h>Int

main(int

argc,char*argv[]){test();return0;}

编写测试程序main.cmyalib.h

myalib.c

myalib.o

libtest.a

main.c

main.otestresult编译main.cgcc–omainmain.o-L./-ltest

myalib.h

myalib.c

myalib.o

libtest.a

main.c

main.o

main生成可执行文件执行./main2024/1/24Page312.2Linux程序设计基础知识(4)使用生成的静态库注意:1、在gcc的参数说:-I参数后加上静态库头文件的路径。-L参数后加上库文件所在目录-l参数后加上库文件名,但是要去掉lib和.a扩展名。比如库文件名是libtest.a那么参数就是-ltest2、-l参数好象应该加到输入文件名的后面,否则会报错。2024/1/24Page322.2Linux程序设计基础知识5、例题:创建静态库和动态库

创建动态库步骤:(1)编写库的头文件及库的实现文件(2)用gcc编译生成动态态库文件(3)使用生成的动态库2024/1/24Page332.2Linux程序设计基础知识(2)用gcc编译生成动态态库文件gcc-shared-fPIC

myalib.c-olibtest.somyalib.h

myalib.c

myalib.o

libtest.so执行完后会生成一个动态库文件libtest.so注意:动态库文件名一定要以lib打头,.so结尾2024/1/24Page342.2Linux程序设计基础知识5、例题:创建静态库和动态库

创建动态库步骤:(1)编写库的头文件及库的实现文件(2)用gcc编译生成动态态库文件(3)使用生成的动态库2024/1/24Page352.2Linux程序设计基础知识(3)使用生成的动态库gcc-I./-cmain.c#Include<myalib.h>Int

main(int

argc,char*argv[]){test();return0;}

编写测试程序main.cexportLD_LIBRARY_PATH=./gcc–omainmain.o-L./-ltest

执行./maintestresult指定加载库的路径编译main.cmyalib.h

myalib.c

myalib.o

libtest.a

main.c

main.o生成可执行文件myalib.h

myalib.c

myalib.o

libtest.so

main.c

main.o

main2024/1/24Page362.2Linux程序设计基础知识(3)使用生成的动态库注意:如果不指定LD_LIBRARY_PATH,程序执行将出错2024/1/24Page372.2Linux程序设计基础知识5、GUU的C函数库glibc

(1)glibc是Linux上最重要的函数库

glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。

2024/1/24Page382.2Linux程序设计基础知识

(2)glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,主要的如下:

string:字符串处理

signa:信号处理

dlfcn:管理共享库的动态加载 direct:文件目录操作 elf:共享库的动态加载器,即interpreter2024/1/24Page392.2Linux程序设计基础知识

iconv:不同字符集的编码转换

inet:socket接口的实现

intl:国际化,即gettext的实现

io:基本IO操作

linuxthreads:线程 locale:本地化 login:虚拟终端设备的管理,及系统的安全访问

malloc:动态内存的分配与管理

stdlib:其它基本功能2024/1/24Page402.3Linux下的C语言开发环境

Linux中提供了C语言的开发环境。这些开发环境主要包括:程序生成工具;程序调试工具;工程管理工具。2024/1/24Page412.3Linux下的C语言开发环境1.程序生成工具——GCC(GNUCompilerCollection)

GCC提供了C语言的编译器、汇编器、连接器以及一系列辅助工具。GCC可以用于生成Linux中的应用程序,也可以用于编译Linux内核和内核模块,是Linux中C语言开发的核心工具。2024/1/24Page422.3Linux下的C语言开发环境2.程序调试工具——GDB GDB是Linux中一个强大的命令行调试工具,使用GDB调试C语言的时候,可以使用设置断点、单步运行、查看变量等功能。

2024/1/24Page432.3Linux下的C语言开发环境3.工程管理工具——make和Makefile 在工程管理方面,有效地使用make和Makefile可以统筹工程中的各个文件,并在编译过程中根据时间戳,有选择地进行编译,减少程序生成时间。

2024/1/24Page442.4嵌入式LinuxC语言开发流程和开发工具2024/1/24Page452.4嵌入式LinuxC语言开发流程和开发工具2.4.1编译 编译是指把用高级语言编写的程序转换成相应处理器的汇编语言程序的过程。

从本质上讲,编译是一个文本转换的过程。编译过程包含了C语言的语法解析和汇编语言的生成两个步骤。编译一般是逐个文件进行。源程序(文本)——>汇编程序2024/1/24Page462.4嵌入式LinuxC语言开发流程和开发工具2.4.2汇编

汇编是从汇编语言程序生成目标系统的二进制代码(机器代码)的过程。

汇编代码——>二进制代码(目标文件)2024/1/24Page472.4嵌入式LinuxC语言开发流程和开发工具2.4.3连接 连接过程是指将汇编生成的多段机器代码组合成一个可执行程序。

一般来说,通过编译和汇编过程,每一个源文件将生成一个目标文件。连接器的作用就是将这些目标文件组合起来,组合的过程包括了代码段、数据段等部分的合并,以及添加相应的文件头。多个目标文件——>一个可执行程序注意:头文件的添加时机为连接时才添加,考虑原因?2024/1/24Page482.5嵌入式Linux中程序的运行原理2.5.1在Linux的开发环境中,C语言程序的运行环境

作为UNIX操作系统的一种,Linux的操作系统提供了一系列的接口,这些接口被称为系统调用(SystemCall)。 C语言的库函数通过调用系统调用来实现,库函数对上层提供了C语言库文件的接口。 在应用程序层,通过调用C语言库函数和系统调用来实现功能。(一般来说,应用程序大多使用C语言库函数实现其功能,较少使用系统调用。)2024/1/24Page492.5嵌入式Linux中程序的运行原理

2.5.2可执行程序的构成

C语言程序经过编译-汇编-连接,最终生成可执行程序格式。可执行程序中包含两个部分的内容:程序头程序主体(二进制机器代码) 在程序头中包含了供操作系统加载的信息,操作系统根据这些信息加载可执行程序。 可执行程序的主体依然是二进制的机器代码。程序在运行的时候,正是靠逐条地执行这些机器代码,形成程序运行的序列。2024/1/24Page502.5嵌入式Linux中程序的运行原理2.5.3ELF 1、ELF(excutableandlinkingformat)是一种可执行可链接格式的二进制文件“可执行”指可以被调入内存供CPU直接运行;“可链接”指多个ELF格式的目标文件可以被链接在一起形成一个可执行文件。

2024/1/24Page512.5嵌入式Linux中程序的运行原理

2、ELF可以用来表示三种主要的类型目标文件(objectfile):

可执行文件——executablefile(应用程序)可重定向文件——relocatablefile(*.o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论