这是一个经常遇到的问题,在软件开发过程中,需要将某些功能封装成一个独立的模块,这样维护升级也很方便。现在我们就要把开源日志库log4cxx封装成so动态加载库文件。
在上一篇文章《log4cxx日志库RedHat下安装》中,我们已经将log4cxx安装在home/mac/log4cxx/log4cxx下了,那么接下来的操作我们就继续在这个路径下进行。
还是先tree一下/home/mac/log4cxx这个目录吧
log4cxx ---apr ---apr-util ---log4cxx
那再新建四个目录吧
mkdir src lib include bin
再tree一下/home/mac/log4cxx这个目录
log4cxx ---apr ---apr-util ---log4cxx ---src ---lib ---include ---bin
在/home/mac/log4cxx下新建文件Log.h Log.cpp,这两个文件里面放的内容是你自己写的调用log4cxx库的程序,体现了你自己的封装(将log4cxx库再封装一下给你的其他程序用,一个用法就是自己定义一个类Log,它提供了自己的一些方法,而每个方法具体的实现又是和log4cxx有关)
可能会有疑问,为什么将/home/mac/log4cxx这个目录下创建Log.h Log.cpp这两个文件,而不是在src目录下。这是因为Log.h Log.cpp将不会直接提供给用户,严格地说是Log.cpp这个文件不会提供给用户,Log.h稍后会被放入到include目录下。
至此,创建动态库libLog.so的准备工作已经做好了,接下来就是gcc命令的执行了
g++ -fPIC -shared Log.h Log.cpp -o libLog.so \ -I/home/mac/log4cxx/log4cxx/include \log4cxx相关库的头文件路径,里面其实就是各个函数,变量的声明 -L/home/mac/log4cxx/log4cxx/lib \Log4cxx相关库的动态库路径,里面其实就是各个函数,变量的定义 -llog4cxx 具体的动态库
执行完后,会在当前目录/home/mac/log4cxx下生成libLog.so文件
把它移动到lib目录下,也要把/home/mac/log4cxx/下apr apr-util log4cxx里面lib下和so相关的文件全部复制到/home/mac/log4cxx/lib下(这一步很关键)
再把Log.h文件移动到include目录下,同时也要把/home/mac/log4cxx/log4cxx/include/log4cxx这个目录(包括这个目录名)全部复制到/home/mac/log4cxx/include目录下(这一步很关键)
这时候,进入src目录,新建文件main.cpp,在里面写入你欲调用动态库libLog.so的内容,记得要包含Log.h文件,既需要
#include “Log.h”
这一句
好了,让我们生成一个加载动态库libLog.so的程序吧
g++ main.cpp -o ../bin/test \ -I/home/mac/log4cxx/include -L/home/mac/log4cxx/lib -lLog.so
执行完后会在bin目录下生成test可执行程序
如果./test后提示找不到动态库,那么就是/home/mac/log4cxx/lib这个目录不在系统动态库查找路径下,具体解决方法很多,在这就不写了,搜索一下一大堆。
可能会有人疑问,动态库的加载不是用到函数dlopen吗?其实我一开始就是按照在程序中使用dlopen这个函数的,不过领导要我用这种方法,我也算开了眼界了。所以本片文章的题目是linux下把log4cxx封装成so动态库文件(一),有一就有二,下一篇我就谢谢如何用函数dlopen调用动态库
谢谢观赏
linux下把log4cxx封装成so动态库文件(一),布布扣,bubuko.com