day02

静态库和共享库(动态库)
c程序员的错误处理
环境变量和环境表
一个操作系统是非常复杂的,根据非常多的系统函数,如何管理这些系统函数?比如:函数a()究竟来自与那个.o文件?


需要把这些.o文件打包,打包成静态库(.a)或者共享库(.so)。


静态库和共享库的区别


静态库是代码的归档,在使用静态库时是采用的复制的代码的方式。共享库是可执行文件的组成部分,在使用共享库时采用的提供代码在共享库的地址给可执行文件的方式。


静态库和共享库的优缺点
静态库的优点就是完全独立,代码链接后在运行时不需要静态库的参与,同时效率稍高,缺点是占用空间大,修改和维护不方便

共享库的优点就是占用空间小,修改和维护方便,缺点就是不独立,运行时需要可执行文件和共享库同时参与,效率低。


静态库的创建和使用步骤(静态库可以没有主函数)
1.写源文件.c保存退出
2.编译源文件,生成.o文件。
3.用ar -r命令生成静态库文件.a
ar -r lib库名.a xxxx.o
静态库文件有命名规范,以lib开头,以.a结束,中间是库名


调用步骤:
1.写调用的源文件.c保存退出
2.编译链接源文件和静态库文件,有三种方式:
1)直接连接   gcc  test.c库文件名(gcc test.c libmyku.a)
2)双L连接法  gcc test.c -l库名 -库所在的路径
库名不包含lib和.a  
gcc test.c -lmyku -L.
3)单l连接法 需要先配置环境变量LIBRARY_PATH,把库文件所在的路径配置进来,然后用l就可以了。
gcc test.c -lmyku


注:提供库文件的程序员,必须同时提供头文件。


共享库的创建和使用步骤
1.创建源文件,保存退出
2.编译源文件,生成.o文件gcc -c -fpic add.c
3.生成共享库文件。gcc -shared add.o -olibmyku.so


注:共享库在运行时会参与进来,因此在运行时,必须保证能找到共享库,需要配置环境变量LD_LIBRARY_PATH.




Unix 系统就是提供了一系列的共享库和头文件,代码出自共享库,函数的原型声明出自头文件。ldd a.out就可以查看相关的库文件都有那些


c程序员的错误处理 -错误处理不可怕,是程序员必须面对的,是软件编程的一个组成部分。
不是所有的错误都可以处理的,但是可以处理的错误必须考虑如何处理。计算机的语言(c++/java)都是采用异常机制进行错误处理(exception),但c语言没有异常机制。
c程序员用返回值标识错误
关于返回值,有以下4种情况:
1.如果函数的返回值是int ,并且返回的数据不可能是负数,用返回-1代表出错了,其它数据正常返回
2.如果函数的返回值是int,并且返回的数据可能是负数,用返回0代表没有错,用返回-1代表出错;数据用指针返回
3.如果函数的返回值是指针,用NULL代表出错,个别函数也用(void*)-1代表出错。
4如果函数不可能出错或不需要考虑错误处理,返回值不做任何改变
注:以上4种情况只是c程序员的一般情况,也有特别存在




练习:
有4个函数,帮忙分析一下如何搞定错误处理?
a,换行打印传入的字符串。4
b.返回0—9范围内的随机数,随机到5返回错误1。
c.比较两个整数的最大值并返回最大值2
d.如果传入的字符串“error”,返回错误,否则返回该字符串本身。3




c官方提供了一个变量和3个函数用于错误的显示和处理
c语言存储的都是错误编号。而如果想知道是什么错误,必须查看编号对应的错误信息。错误编号存在外部全局变量error中,错误编号转错误信息的函有:
strerror() -传入错误编号,返回错误信息,不打印
perror()  -自动打印error对应的错误信息并换行(没有发生的错误无法查看)
printf("%m") -自动打印   errno对应的错误信息,了解


如果代码出错了,会改变errno的值,记录错误编号,如果代码没有出错,errno是不会改变的,因此不能用errno判断是否出错,errno是用来记录错误信息的,返回值是用来判断是否出错的


c程序员处理错误的一般流程
用返回值判断是否出错,如果出错,调用perror()打印错误信息,并进行错误分支的代码编程




注:不是所有的函数都支持errno,有些函数就没有使用errno,比如线程相关的函数都没有使用。


环境变量和环境表
程序员如何操作环境变量,命令也是程序员写的程序


环境表是字符指针数组,char* arr[],是所有环境变量在内存中的首地址,字符指针数组可以用char**(二级指针)表示。很多时候环境表就是使用二级指针表示
extern char**environ;就可以直接获得环境表的首地址
environ也是一个外部的全局变量,但在声明的时候没有加上extern,因此需要调用者自己加,extern代表全局变量来自于其他文件
environ一般都不直接参与指针的移动,而是用一个局部变量environ进行指针移动,因为environ是所有的程序共用的。

























































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值