包括三个部分:
1. 动态库编译
2. 动态库使用方式:编译链接
3. 动态库使用方式: dlopen
今天面试有人说你连基本的动态库加载都不清楚?!错要承认挨打站稳;
如下:
---------文件列表-----------
hello.c ---- hello()函数 输出字符串
hello.h --- 包含一个头文件
main.c ---编译方式使用动态库的文件
dlmain.c ---dlopen方式使用动态库的文件
----hello.h---
#ifndef _HELLO_H_
#define _HELLO_H_
void hello(const char* name);
#endif
----hello.c---
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
---mian.c---
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
---dlmain.c---
#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>
int main()
{
void *handle = NULL;
void (*hello)(const char* str);
handle = dlopen("./libmyhello.so", RTLD_LAZY);
if(handle==NULL)
{
printf("dll loading error.\n");
return 0;
}
hello = (void(*)(const char*))dlsym(handle,"hello");
if(dlerror()!=NULL)
{
printf("fun load error.\n");
return 0;
}
hello("dlopen ");
dlclose(handle );
}
实验:如果先dlclose 再调用so库中查找到的函数,会发生什么事儿?
PS:-> 符号表示输出,不是命令。
----------前序,静态库的方式-----------
1.//先生成 中间 .o文件
#gcc hello.c ->hell.o
2. //打包静态库 ar功能请再查询
#ar cr libmyhello.a hello.o-> libmyhello.a
3. // 使用静态库生成目标文件
#gcc -o hello main.c -L . -lmyhello -> hello
4.//执行
#./hello -> hello everyone!
5.//删除静态库,再执行还是正确,说明hello目标文件中已经包含了 libmyhello.o内容;
#rm libmyhello.o
#./hello -> hello everyone!
---------动态库使用,编译链接方式------------
1.生成so文件
#gcc -shared -fPCI -o libmyhello.so hello.o ->libmyhello.so
2. 编译目标文件
gcc -o hello main.c -L . -lmyhello ->hello
3.执行目标文件
#./hello 会报错:while loading shared libraries:libmyhello.so:can not open shared object:No shuch file or directory
4. 拷贝so到用户库
#cp libmyhello.so /usr/lib 拷贝自己的so库到 /usr/lib 下,也可以用修改环境变量等方式,请自行扩展
#./hello -> hello everyone! 这次正确了
---------动态库使用,dlopen方式------------
1. 生成动态库.
#gcc -ldl dlmain.c -o dlmain ->dlmain
2. 执行
#./dlmain ->hello everyone!
PS:
Q1)动态库和静态库都存在的情况,都用gcc -o hello main.c -L . -lmyhello 这样的命令生成,动态库和静态库都存在的时候,有没有冲突?怎么知道是.so库还是.a库呢?
Q1)验证方式:可以将动态库和静态库都编译好,执行的前把动态库删掉,如果报错是否证明使用的是动态库,反之是静态库;
验证结果:当动态库和静态库都存在的情况下,优先使用so动态库;
清理动作没有赘述,实验中,尽量将对比前后的动态库进行恢复,比如做后面dlopen方法的实验, usr/lib下的 libmyhello.so先删掉,看看会发生什么。到底用到了什么。
参考博文:
http://www.cnblogs.com/leaven/archive/2010/06/11/1756294.html【Linux动态库的编译与使用 转载】
http://www.cnblogs.com/softfair/archive/2008/09/17/l-dynamic-libraries.html【Linux 动态库剖析】
http://blog.youkuaiyun.com/chaieven/article/details/20796421【linux下的静态库和动态库的编译和应用】