linux下把log4cxx封装成so动态库文件(一)

这是一个经常遇到的问题,在软件开发过程中,需要将某些功能封装成一个独立的模块,这样维护升级也很方便。现在我们就要把开源日志库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

时间: 2024-11-05 23:29:44

linux下把log4cxx封装成so动态库文件(一)的相关文章

linux下添加动态链接库路径、动态库加载等方法

linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596 Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,MySQL),编译连接可以正常进行,但是在运行时出现如"error while loading shared libraries: libnet.so.1:cannot open shared object file :No such file or directory"的错误提示. 原

java调用dll或so动态库文件(c++/c)

java调用dll或so动态库文件(c++/c) 博客分类: 工作 CC#C++JavaEclipse java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CDT(cdt-master-4.0.3)+MinGW(MinGW-5.1.4) 一:下面是java调用dll(C++) 1:下载并安装cdt :http://www.eclipse.org/cdt/downloads.php  :选择自己eclipse 支持的cdt插件,下载,并且 通过eclipse--

【转】VS2013动态库文件的创建及其使用详解

一.VS2013动态库文件的创建 1.新建项目,win32,win32项目,输入项目名称,例如MakeDll. 2.”确定“——”下一步“,选择”DLL“选项,再点”完成“: 3.菜单栏选择”项目“——>”添加新项“,来创建头文件MakeDll.h. 在MakeDll.h中输入以下例子代码: 1 #ifdef DLL_API//如果已经定义就什么都不做 2 //nothing to do 3 #else //否则定义DLL_API 4 #define DLL_API __declspec(dll

Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法

原来使用Win7的32位系统,进行C#工程的开发,后来重装系统,换成了win7的64位系统 调试原来的工程,由于在其中引用了"SQLite"的32位的dll,导致在64为位下程序无法运行(但是编译可以通过) 后来通过修改工程文件(.csproj),在其中设置引用的条件,解决了问题 打开引用了SQLite的工程(例如叫做info)的工程文件(info.csproj),找到对SQLite引用的语句,类似如下的代码 代码如下: <Reference Include="Syst

修改OpenSSL默认编译出的动态库文件名称

在 Windows 平台上调用动态链接库 dll 文件时,有两种方式:a) 隐式的加载时链接:使用 *.lib (导入库)文件,在 IDE 的链接器相关设置中加入导入库 lib 文件的名称,或在程序中加入预编译指令 #pragma comment (lib,”*.lib”).b) 显式的运行时链接.不使用 *.lib (导入库)文件,使用 Load Library(),GetProcAddress() 函数来加载动态库中的函数.要注意的是在导入库 lib 文件内部包含了其对应 dll 文件的名称

Makefile 编译动态库文件及链接动态库

本文为原创文章,转载请指明该文链接 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc/apue.h 4 comm/errorhandle.c 5 dynamiclib/Makefile 6 dynamiclib/dynamiclib_add.c 7 dynamiclib/dynamiclib_mul.c 8 dynamiclib/inc/dynamiclibs.h 9 dynamiclib/libs/ 1. dynamiclib目录 dynamic

Linux高级编程--02.gcc和动态库

在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio.h> void main(void) { printf("hello world!\r\n"); } 可以通过如下指令来编译出一个可执行文件: gcc hello.c 执行完该命令后,就会得到一个a.out的可执行文件. 编译的过程 前面的例子只是简单的介绍了一下gcc的使用方法,

Linux学习:Makefile 模板(动态库、静态库、可执行程序)

1.编译动态库 ############################################################# # Makefile for shared library. # 编译动态链接库 ############################################################# #set your own environment option CC = g++ CC_FLAG = -D_NOMNG -D_FILELINE #set

Android 开发:开源库Speex支持arm64的动态库文件

随着处理器制造工艺的不断进步,和Android系统的不断发展,最近出了arm64-v8a的架构,由于项目中用到了speex的第三方语音编解码的动态库,其他架构的处理器暂不用说,一切正常,唯独到arm64-v8a这里出问题了,在Android5.0 arm64位的手机上使用语音会报错,关于其他架构的.so文件编译不再赘述,网上都有资料.废话少说,直接上步骤: 1.下载android-ndk-r10e-windows-x86_64并解压,这个支持arm64 -v8a的编译,之前的版本都不行,我之前用