Linux下动态库的生成和使用

本小猿最近工作于Linux下服务器的开发,记录Linux环境下的点滴成长。

一.动态库的基本概念

1. 动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。

2. 动态链接库的名称有别名(soname), 真名(realname)和链接名(linker name)。别名由一个前缀lib,然后是库的名字,再加上一个后缀“.so”构成。真名是动态链接库真实名称,一般总是在别名的基础加上一个小版本号,发布版本等构成。除此之外,还有一个链接名,即程序链接时使用的库的名字。

3.在动态链接库安装的时候,总是复制文件到某个目录下,然后用一个软连接生成别名,在库文件进行更新的时候,仅仅更新软链接即可。


二.动态库的生成与使用逻辑

1. 第一步,将源文件编译成中间代码文件,Windows下文件格式为.obj,Unix下文件格式为.o;

2. 第二步,生成动态库.so文件

3. 第三步,使用动态库。


三.实例描述,并写成makefile文件

1). test.dll文件夹下面有几个文件,分别是main.cpptest.h、test.cpp;
2)main.cpp文件中的内容:
#include"test.h"
#include<iostream>
using namespace std;

int main()
{
	int a,b;
	cin>>a>>b;
	int c = add(a,b);
	cout<<c<<endl;
	return 0;
}

3)test.h文件中的内容:
#ifndef __TEST__
#define __TEST__

extern int add(int a, int b) ;

extern int sub(int a, int b) ;

#endif

4)test.cpp文件中的内容:
#include"test.h"
#include<iostream>

int add (int a, int b)
{
	std::cout<<"a :"<<a<<" b: "<<b<<std::endl;
	return (a+b);
}

int sub(int a, int b)
{
	return (a - b);
}

动态库的生成

1>首先生成目标文件,但是此时要加编译器选项-fpic和链接器选项-shared,

g++ -fpic  -c  test.cpp

生成中间文件test.o


2>其次生成动态库

gcc  -shared –o  libtest.so test.o

生成动态库test.o就是我们生成的目标动态库。我们以后使用动态库和main.ocpp程序生成可执行程序

说明:

以上两步也可以合成一步搞定:

g++ -shared -fPIC -o libtest.so test.cpp


3>使用动态库:

g++ -o main -L . -ltest main.cpp


4>写成 makefile文件:
libtest.so:test.cpp test.h
	g++ -shared -fPIC -o libtest.so test.cpp
all:libtest.so main.cpp
	g++ -o main -L . -ltest main.cpp
run:all
	LD_LIBRARY_PATH=. ./main
clean:
	rm -rf *.o *.so main


PS: makefile文件如何写会另开一贴记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值