Linux下动态库的生成和使用

来源:互联网 发布:unity3d骰子转动 编辑:程序博客网 时间:2024/05/21 06:50

本小猿最近工作于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.hg++ -shared -fPIC -o libtest.so test.cppall:libtest.so main.cppg++ -o main -L . -ltest main.cpprun:allLD_LIBRARY_PATH=. ./mainclean:rm -rf *.o *.so main


PS: makefile文件如何写会另开一贴记录
0 0
原创粉丝点击