(1)开发时,头文件(.h)中应当只放置“声明”,定义的内容应放入源文件(.c)中。
(2)生成静态库,可使用 ar crv命令;
(3)编译链接生成最终可执行文件时,可使用gcc的-l选项。
废话不说,先上例子:自己写两个c文件,分别用两个函数包装整数的加法和乘法,来个头文件包含这两个函数的声明,再来个main函数做入口,调用这两个函数。
此例中,将这两个c文件做成静态库。目录结构如下:
代码分别如下:
/* 文件: main.c */
#include <stdio.h>
#include "mylib.h"
int main(int argc, char *argv[]) {
int a, b;
printf("input>");
scanf("%d %d", &a, &b);
printf("add: %d\n", add(a, b));
printf("multi: %d\n", multi(a, b));
return 0;
}
/* 文件:add.c */
#include <stdio.h>
int add(int a, int b) {
return a+b;
}
/* 文件: multi.c */
#include <stdio.h>
int multi(int a, int b) {
return a * b;
}
/* 文件: mylib.h
* 这是头文件示例,应当只包含声明
*/
int add(int, int);
int multi(int, int);
如果不生成库文件,直接编译的操作步骤如下:
gcc -c main.c add.c multi.c # 生成main.o, add.o, multi.o
gcc *.o -o main # 这里生成可执行文件main
如果我们想采用生成库文件的方式操作,则步骤如下:
ar crv libcalc.a add.o multi.o # 这里libcalc.a是生成的库文件名
gcc main.o libcalc.a -o main # 直接编译出可执行文件main
# 上一步也可写成:
gcc main.o -o main -L. -lcalc
最后一条命令详细解释下,(1)因为我们生成的libcalc.a这个库文件不在Linux系统默认库文件路径下,因此用-L.选项告诉编译器在.目录找到它。(2)-lcalc告诉编译器要使用libcalc.a的静态库(或者libcalc.so的共享库),这里比较好玩的规则是,如果我们将库起名为libxxx.a(或libxxx.so),则链接时的命令就是-lxxx。
至于静态库和共享库的区别,网上有很多,这里就不赘述了。