在Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。
从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合。
虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的情况都是这样。正因如此,GCC在编译时必须有自己的办法来查找所需要的头文件和库文件。
GCC采用搜索目录的办法来查找所需要的文件,
-I选项可以向GCC的头文件搜索路径中添加新的目录。
例如,如果在/home/hxy/upgrade/include/目录下有编译时所需要的头文件,
为了让GCC能够顺利地找到它们,就可以使用-I选项:
gcc foo.c -I /home/xiaowp/include -o foo
在一个gcc命令中可以用多个 -I
C/C++可以使用两种库.一种是静态库【.a】:
– 静态库在链接时会把库目标代码与最终的可执行程序一起链接到一个文件,这样相对尺寸较大.但处理简单.
Windows下的静态库是以 lib为后缀名的文件,而动态库是以DLL为后缀名的文件.
Linux下的动态链接库是so为后缀,和静态链接库以.a为后缀名;在链接后,静态库的函数都会链接到最终的可执行程序里.这样可执行程序的尺寸比动态链接要大;
静态链接的好处是不需要外部文件的支持,独立运行.在嵌入式环境下,如果尺寸影响不大,最好用静态编译.;
gcc不能直接创建静态库.必须要用归档命令ar来创建
ar用于建立、修改、提取档案文件(archive)。archive是一个包
含多个被包含文件的单一文件(也称之为库文件),其结构保
证了可以从中检索并得到原始的被包含文件(称之为archive中的member)。
ar可以把任何文件归在一起,但通常是用来把gcc编译的目标文件(.o),合在一个静态库中
静态库创建
– $ gcc -Wall -c file1.c file2.c file3.c #一次性编译三个.o
– $ ar rv libname.a file1.o file2.o file3.o #把三个o合在一起 //生成一个静态库文件;
创建一个静态库的脚本
代码:
gcc -c mystrlen.c
gcc -c myshow.c
#把两个目标文件装入静态库libstr.a中
ar rv libstr.a mystrlen.o myshow.o
gcc -c main.c -I.
#gcc main.o libstr.a -o main_a #非标准用法,用全名
gcc main.o -L. -lstr-o main_a #标准用法