本小猿最近工作于Linux下服务器的开发,记录Linux环境下的点滴成长。
一.动态库的基本概念
1. 动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。
2. 动态链接库的名称有别名(soname), 真名(realname)和链接名(linker name)。别名由一个前缀lib,然后是库的名字,再加上一个后缀“.so”构成。真名是动态链接库真实名称,一般总是在别名的基础加上一个小版本号,发布版本等构成。除此之外,还有一个链接名,即程序链接时使用的库的名字。
3.在动态链接库安装的时候,总是复制文件到某个目录下,然后用一个软连接生成别名,在库文件进行更新的时候,仅仅更新软链接即可。
二.动态库的生成与使用逻辑
1. 第一步,将源文件编译成中间代码文件,Windows下文件格式为.obj,Unix下文件格式为.o;
2. 第二步,生成动态库.so文件;
3. 第三步,使用动态库。
三.实例描述,并写成makefile文件
#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
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