Liunx下静态库和动态库的创建与使用

  1. 静态库
    假如我们有如下加减功能的文件:
// 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

  1. 动态库
    假如我们有如下乘除功能的文件:
// 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参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值