在商业开发中,提供的代码 不是 .c,也不是.o文件,而是把 .o文件打包成 库文件。程序员只需要提供 头文件和库文件。
Unix/Linux的库文件分为两类:
静态库
共享库(动态库)
静态库 就是把.o文件做了一个归档,在调用函数时,把整个函数的代码段直接复制到可执行文件中。
共享库 就是把.o文件做了一个归档,在调用函数时,把函数在库中的地址复制到可执行文件(或其它的共享库)中。
优缺点:
静态库执行效率稍高,在运行代码时不需要访问静态库,但体积偏大,不利于修改和维护。
共享库执行效率比静态库慢,在运行代码时需要访问共享库,但体积小,利于修改和维护。
开发中,多半使用共享库。
静态库的创建和调用:
创建步骤:
1 写源代码.c,保存退出。
2 编译源代码,生成目标文件.o。
gcc -c add.c
3 生成静态库文件
ar -r 库文件名 add.o (可以多个.o)
库文件名的规范:
以lib开头,以.a结尾,中间起一个库名
比如:libmyku.a 库文件名
库名:myku
调用步骤:
1 写调用的源代码test.c,保存退出。
2 编译test.c,生成.o文件。
gcc -c test.c
3 连接test.o和静态库文件,有三种方法
3.1 直接连接 gcc test.o libmyku.a
3.2 先配置环境变量LIBRARY_PATH,将库文件所在的路径配置进去,然后用:
gcc test.o -l库名
3.3 双L连接法
gcc test.o -l库名 -L库所在的路径
注:1 使用库需要额外提供头文件
2 系统库已经配置好,所以不需要双L,如果没有配置,也需要双L。
共享库的创建和使用
创建
1 写源程序,保存退出。
2 编译和生成共享库。
gcc -fpic -shared add.c -olibmyku.so
其中,-fpic貌似省略也可以,最好挂上
也有库名的规范,和静态库一样
调用
1 写调用源程序,保存退出。
2 gcc -c 编译,生成.o文件。
3 连接共享库,方式和静态库一样。
注:共享库在运行时 需要配置环境变量LD_LIBRARY_PATH,否则运行不起来。
ldd命令可以查看 程序关联的库文件。
ldd a.out (也可以是共享库文件)
Unix/Linux也提供了一些可以直接调用系统库中函数的API:(了解)
#include <dlfcn.h>
dlopen() -> 直接打开一个共享库文件
dlsym() -> 从一个打开的共享库找到函数
dlclose() -> 关闭共享库
dlerror() -> 判断以上3个函数是否出错
程序员在做项目时,除了写正常代码之外,也需要进行错误的处理(出了错怎么办)。
后期的语言(C++/Java)都是使用异常机制处理错误(exception),但C语言没有异常机制,C处理错误的方式是 使用返回值标识错误。
1 如果返回值为int,并且返回的数据不包括负数,返回-1代表出错,数据正常返回。
2 如果返回值为int,但返回的数据包括负数,数据就不再return,而是用指针带出来,返回-1代表出错,0代表成功。
3 如果返回值为指针,返回0代表出错,其他值代表正常。(有些函数返回-1代表出错)
4 如果函数不可能出错,或者不需要处理出错,返回值用void。
注:以上只是常规情况,也有特例。
Unix/Linux的库文件分为两类:
静态库
共享库(动态库)
静态库 就是把.o文件做了一个归档,在调用函数时,把整个函数的代码段直接复制到可执行文件中。
共享库 就是把.o文件做了一个归档,在调用函数时,把函数在库中的地址复制到可执行文件(或其它的共享库)中。
优缺点:
静态库执行效率稍高,在运行代码时不需要访问静态库,但体积偏大,不利于修改和维护。
共享库执行效率比静态库慢,在运行代码时需要访问共享库,但体积小,利于修改和维护。
开发中,多半使用共享库。
静态库的创建和调用:
创建步骤:
1 写源代码.c,保存退出。
2 编译源代码,生成目标文件.o。
gcc -c add.c
3 生成静态库文件
ar -r 库文件名 add.o (可以多个.o)
库文件名的规范:
以lib开头,以.a结尾,中间起一个库名
比如:libmyku.a 库文件名
库名:myku
调用步骤:
1 写调用的源代码test.c,保存退出。
2 编译test.c,生成.o文件。
gcc -c test.c
3 连接test.o和静态库文件,有三种方法
3.1 直接连接 gcc test.o libmyku.a
3.2 先配置环境变量LIBRARY_PATH,将库文件所在的路径配置进去,然后用:
gcc test.o -l库名
3.3 双L连接法
gcc test.o -l库名 -L库所在的路径
注:1 使用库需要额外提供头文件
2 系统库已经配置好,所以不需要双L,如果没有配置,也需要双L。
共享库的创建和使用
创建
1 写源程序,保存退出。
2 编译和生成共享库。
gcc -fpic -shared add.c -olibmyku.so
其中,-fpic貌似省略也可以,最好挂上
也有库名的规范,和静态库一样
调用
1 写调用源程序,保存退出。
2 gcc -c 编译,生成.o文件。
3 连接共享库,方式和静态库一样。
注:共享库在运行时 需要配置环境变量LD_LIBRARY_PATH,否则运行不起来。
ldd命令可以查看 程序关联的库文件。
ldd a.out (也可以是共享库文件)
Unix/Linux也提供了一些可以直接调用系统库中函数的API:(了解)
#include <dlfcn.h>
dlopen() -> 直接打开一个共享库文件
dlsym() -> 从一个打开的共享库找到函数
dlclose() -> 关闭共享库
dlerror() -> 判断以上3个函数是否出错
程序员在做项目时,除了写正常代码之外,也需要进行错误的处理(出了错怎么办)。
后期的语言(C++/Java)都是使用异常机制处理错误(exception),但C语言没有异常机制,C处理错误的方式是 使用返回值标识错误。
1 如果返回值为int,并且返回的数据不包括负数,返回-1代表出错,数据正常返回。
2 如果返回值为int,但返回的数据包括负数,数据就不再return,而是用指针带出来,返回-1代表出错,0代表成功。
3 如果返回值为指针,返回0代表出错,其他值代表正常。(有些函数返回-1代表出错)
4 如果函数不可能出错,或者不需要处理出错,返回值用void。
注:以上只是常规情况,也有特例。