- 静态库
假如我们有如下加减功能的文件:
// add.h
#ifndef __ADD_H__
#define __ADD_H__
int Add(int a, int b);
#endif // __ADD_H__
// add.c
#include "add.h"
int Add(int a, int b)
{
return a + b;
}
// sub.h
#ifndef __SUB_H__
#define __SUB_H__
int Sub(int a, int b);
#endif // __SUB_H__
// sub.c
#include "sub.h"
int Sub(int a, int b)
{
return a - b;
}
有个应用想利用加减函数:
// main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"
int main()
{
int a = 6;
int b = 3;
printf("a + b = %d, a - b = %d\n", Add(a, b), Sub(a, b));
return 0;
}
下面开始编译.a静态库,再链接到main.c中:
// 生成obj文件
1.gcc -c *.c
// 删除多余的main.o
2.rm main.o
// 生成cal1静态库
3.ar -rc libcal1.a *.o
// 删除过程中的.o文件
4. rm *.o
// 链接libcal1.a到main.c (ai)表示音标,为了区分I与小L。因为网页上I(ai),l(小L)根本看不出区别。。。实际链接是不要加音标哈。test表示生成文件的名字,可修改。
5.gcc -o test main.c -I(ai) -L libcal1.a
然后就可以执行test程序了
6. ./test
以上是库、头文件、引用程序都在同一目录的情况下。假若是这种结构呢?
----libcal1
--------include
------------add.h
------------sub.h
--------lib
------------libcal1.a
----main.c
我们如何执行第5步的链接过程?
// -I(ai)指定头文件目录 -L 指定库文件目录 -l(小L)指定库名,注意小L后跟的库名要去掉lib与.a。
gcc -o test main.c -I(ai) ./libcal/include -L ./libcal/lib -l(小L) cal1
- 动态库
假如我们有如下乘除功能的文件:
// mul.h
#ifndef __MUL_H__
#define __MUL_H__
int Mul(int a, int b);
#endif // __MUL_H__
// mul.c
#include "mul.h"
int Mul(int a, int b)
{
return a * b;
}
// div.h
#ifndef __DIV_H__
#define __DIV_H__
int Div(int a, int b);
#endif // __DIV_H__
// div.c
#include <stdio.h>
#include "div.h"
int Div(int a, int b)
{
if (0 == b) {
printf("error! b is zero\n");
return 0;
}
return a / b;
}
有个应用想利用乘除函数:
// main.c
#include <stdio.h>
#include "mul.h"
#include "div.h"
int main()
{
int a = 6;
int b = 3;
printf("a x b = %d, a / b = %d\n", Mul(a, b), Div(a, b));
return 0;
}
下面开始编译.so动态库,再链接到main.c中:
// 生成obj文件
1.gcc -c *.c
// 删除多余的main.o
2.rm main.o
// 生成cal2动态库
3.gcc -shared -o libcal2.so *.o
// 删除过程中的.o文件
4. rm *.o
// 链接libcal1.a到main.c (ai)表示音标,为了区分I与小L。因为网页上I(ai),l(小L)根本看不出区别。。。实际链接是不要加音标哈。test表示生成文件的名字,可修改。
5.gcc -o test main.c -I(ai) -L libcal2.so
然后就可以执行test程序了
6. ./test
哈哈,然后就报错了。因为动态库需要动态运行时要加载所需的库,所以我们要指定所使用的动态库路径。
方法1:将编译好的libcal2.so放到/usr/lib中。比较暴力。。。
方法2:添加配置文件。vim /etc/ld.so.conf.d/mycal2.conf。 将libcal2.so的绝对路径写到此文件中。再调用ldconfig重新加载配置。大功告成。./test完美运行。
假若.h,.so与main.c不在同一目录下如何链接呢?方法与静态库一样,使用-I(ai)指定头文件目录,-L指定库文件目录,-l(小L)指定库名。同样需要去掉lib与.so(栗子:libcal2.so —> cal2)。
另外-L指定的库目录中.a.so同时存在。优先选择.so进行链接。若想用.a进行链接gcc需要加-static参数。