Linux中简单的静态库编译和调用

静态库创建的一般步骤为:

(1)先生成目标文件*.o文件,以calc.c为例:gcc -o calc.o -c calc.c
(2)然后生成静态库libxxx.a: ar -rcs libcalc.a calc.o
  参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
  参数c:创建一个库。不管库是否存在,都将创建。
  参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果a文件缺少索引,可以使用ranlib命令添加)

下面进行libcalc.a的生成:

(1)创建lib和static目录
Linux中简单的静态库编译和调用
(2)在static目录下创建calc.h、calc.c和Makefile。
具体代码如下:
Linux中简单的静态库编译和调用
Linux中简单的静态库编译和调用

Makefile:

Linux中简单的静态库编译和调用

wildcard和patsubst

在 GNU Make 里有一个叫 ‘wildcard’ 的函 数,它有一个参数,功能是展开成一列所有符合由其参数描述的文 件名,文件间以空格间隔。可以像下面所示使用这个命令:
Linux中简单的静态库编译和调用
这行会产生一个所有以 ‘.c’ 结尾的文件的列表,然后存入变量 src 里。
  另一个有用的函数是 patsubst ( patten substitude, 匹配替 换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的 由空格分隔的字列(例如,src)。
Linux中简单的静态库编译和调用
这行将处理所有在 src字列中的字(一列文件名),如果它的结尾是 ‘.c’ ,就用 ‘.o’ 把 ‘.c’ 取代。注意这里的 % 符号将匹 配一个或多个字符,而它每次所匹配的字串叫做一个‘柄’(stem) 。 在第二个参数里, % 被解读成用第一参数所匹配的那个柄。

(3)运行Makefile,并拷贝libcalc.a到lib文件中
Linux中简单的静态库编译和调用
Linux中简单的静态库编译和调用

2.静态库的调用

Linux中简单的静态库编译和调用
使用静态库
1>使用gcc命令带上库文件就OK了
gcc -o calcmain calcmain.c ./lib/libcalc.a
2> 也可以使用命令”-l库名”进行,库名是不包含库函数库和扩展名的字符串。
gcc -o calcmain calcmain.c -lcalc
上面的命令执行完后,系统返回:
Linux中简单的静态库编译和调用
说明:上面的命令将在系统默认的路径下查找calc函数库,并把他链接到要生成的目标程序上。系统提示没有找到库文件calc,这是由于calc库函数没有在系统默认的查找路径下,我们需要认为指定库函数的路径,例如:库文件和当前编译文件在同一目录下: gcc -o calcmain calcmain.c -lcalc -L ./lib
说明:
  在使用-l选项时,-o选项的目的名要在-l链接的库名之前,否则gcc会认为-l是生成的目标而出错。

-L ./static表示将./static目录作为第一个寻找库文件的目录,寻找的顺序是:./static -->/lib–>/usr/lib–>/usr/local/lib

运行结果:
Linux中简单的静态库编译和调用