log4cplus第一次在windows下使用的时候很快就完成了,最近在Linux下尝试使用时遇到了不少问题,主要原因是对Linux的编译连接不熟悉,以下就记录安装使用的过程,希望对需要的人有所帮助。

1.下载并解压log4cplus_1.2.1可以在网上下载log4cplus_1.2.1,下载完成后解压,注意,解压后在 log4cplus_1.2.1 目录下应该有 configure 文件。

2.安装

在 log4cplus_1.2.1 目录下依次执行如下命令

#### 有问题的命令 ./configure --prefix=/usr/local/   网上介绍的大多是如此写法,虽然能编译通过,但是会有一些问题,详见第 5 节

./configure --prefix=/usr/local/ --enable-static CXXFLAGS="-std=c++0x"

make

make install

其中 --prefix 指明了安装目录,--enable-static 指明了要生成静态库(可以不包含,这样就不会生成 .a 文件), CXXFLAGS="-std=c++0x" 指明了使用c++11(注意兼容性,如果编译库用了c++11,则引用该库时必须使用c++11)如果安装成功,则在 /usr/local/lib 目录下有 liblog4cplus-1.2.so.5、liblog4cplus-1.2.so.5.1.6、liblog4cplus.la、liblog4cplus.so 文件(.so是动态链接库的静态库,.so.5是动态链接库,相当于windows下的.dll,liblog4cplus.a 是静态库,添加--enable-static 后会生成,默认只生成动态库),还有一个文件夹 pkgconfig 只包含了 一个log4cplus.pc 文件,该文件记录了安装目录、版本号等基本信息。在/usr/local/下有 include 文件,其中的 log4cplus 文件夹就包含了该库依赖的头文件。

error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

3.编译测试demo

测试需要四个文件,是 MyLogger.h , main.cpp ,  logconfig.property , CMakeLists.txt (用cmake编译时可用) ,文件内容如下,放入同一个文件夹进行编译

MyLogger.h

#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/layout.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/helpers/stringhelper.h> #define MY_LOG_FILE_PATH "logconfig.property" class MyLogger
{
private:
MyLogger()
{
log4cplus::initialize();
log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH)); m_rootLog = log4cplus::Logger::getRoot(); m_loggerYW = log4cplus::Logger::getInstance("loggerYW");
m_loggerWJ = log4cplus::Logger::getInstance("loggerWJ");
m_loggerUI = log4cplus::Logger::getInstance("loggerUI");
}
~MyLogger()
{
if (m_logger)
{
delete m_logger;
}
} static MyLogger* m_logger; public:
static MyLogger * getInstance()
{
if (m_logger == NULL)
{
m_logger = new MyLogger();
}
return m_logger;
} log4cplus::Logger m_rootLog; log4cplus::Logger m_loggerYW;
log4cplus::Logger m_loggerWJ;
log4cplus::Logger m_loggerUI; }; MyLogger* MyLogger::m_logger = NULL;

main.cpp

#include "MyLogger.h"

int main(int argc, char *argv[])
{
MyLogger * myLoger = NULL;
myLoger = MyLogger::getInstance(); LOG4CPLUS_FATAL(myLoger->m_loggerYW, "DeleteService failed,errCode=[" << << "]");
LOG4CPLUS_DEBUG(myLoger->m_loggerWJ, " Service is removed");
LOG4CPLUS_DEBUG(myLoger->m_loggerUI, " Service "); return ;
}

logconfig.property

log4cplus.rootLogger=DEBUG,rootLogger
log4cplus.appender.rootLogger=log4cplus::RollingFileAppender
#log4cplus.appender.rootLogger=log4cplus::ConsoleAppender
log4cplus.appender.rootLogger.MaxFileSize=100MB
log4cplus.appender.rootLogger.MaxBackupIndex=
log4cplus.appender.rootLogger.File=rootLogger.log
log4cplus.appender.rootLogger.layout=log4cplus::PatternLayout
log4cplus.appender.rootLogger.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.rootLogger.filters.=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.rootLogger.filters..LogLevelMin=TRACE
log4cplus.appender.rootLogger.filters..LogLevelMax=FATAL
log4cplus.appender.rootLogger.filters..AcceptOnMatch=true
log4cplus.appender.rootLogger.filters.=log4cplus::spi::DenyAllFilter log4cplus.logger.loggerYW=DEBUG,loggerYW
log4cplus.appender.loggerYW=log4cplus::RollingFileAppender
log4cplus.appender.loggerYW.File=loggerYW.log
log4cplus.appender.loggerYW.layout=log4cplus::PatternLayout
log4cplus.appender.loggerYW.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerYW.filters.=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerYW.filters..LogLevelMin=TRACE
log4cplus.appender.loggerYW.filters..LogLevelMax=FATAL
log4cplus.appender.loggerYW.filters..AcceptOnMatch=true
log4cplus.appender.loggerYW.filters.=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerYW.MaxFileSize=100MB
log4cplus.appender.loggerYW.MaxBackupIndex=
log4cplus.additivity.loggerYW=false log4cplus.logger.loggerWJ=DEBUG,loggerWJ
log4cplus.appender.loggerWJ=log4cplus::RollingFileAppender
log4cplus.appender.loggerWJ.File=loggerWJ.log
log4cplus.appender.loggerWJ.layout=log4cplus::PatternLayout
log4cplus.appender.loggerWJ.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerWJ.filters.=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerWJ.filters..LogLevelMin=TRACE
log4cplus.appender.loggerWJ.filters..LogLevelMax=FATAL
log4cplus.appender.loggerWJ.filters..AcceptOnMatch=true
log4cplus.appender.loggerWJ.filters.=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerWJ.MaxFileSize=100MB
log4cplus.appender.loggerWJ.MaxBackupIndex=
log4cplus.additivity.loggerWJ=false log4cplus.logger.loggerUI=DEBUG,loggerUI
log4cplus.appender.loggerUI=log4cplus::RollingFileAppender
log4cplus.appender.loggerUI.File=loggerUI.log
log4cplus.appender.loggerUI.layout=log4cplus::PatternLayout
log4cplus.appender.loggerUI.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerUI.filters.=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerUI.filters..LogLevelMin=TRACE
log4cplus.appender.loggerUI.filters..LogLevelMax=FATAL
log4cplus.appender.loggerUI.filters..AcceptOnMatch=true
log4cplus.appender.loggerUI.filters.=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerUI.MaxFileSize=100MB
log4cplus.appender.loggerUI.MaxBackupIndex=
log4cplus.additivity.loggerUI=false

CMakeLists.txt

# CMake 最低版本号要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) # 项目名
PROJECT(LOG) # 添加第三方的库
SET(INC_DIR "/usr/local/include/")
SET(LINK_DIR "/usr/local/lib") INCLUDE_DIRECTORIES(${INC_DIR}) # 设置头文件搜索路径
LINK_DIRECTORIES(${LINK_DIR}) #指定要链接的库文件的路径,一般不需要
# 将第三方的库链接到可执行文件,静态链接
LINK_LIBRARIES(log4cplus) # 指定源文件
SET(SRC_LIST "main.cpp")
MESSAGE(STATUS "SRC_LIST :" ${SRC_LIST}) # 指定生成目标
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST}) # 将第三方的库链接到可执行文件,动态链接
#TARGET_LINK_LIBRARIES(${PROJECT_NAME} log4cplus) # 安装目标文件
SET(PROJECT_INSTALL_PREFIX "/mnt/hgfs/VM_Shared/Teselog4cplus/build/dd")
#INSTALL(TARGETS ${PROJECT_NAME}
# DESTINATION ${PROJECT_INSTALL_PREFIX}
# PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) # 安装配置文件
SET(CONFIG_INSTALL_PREFIX "/mnt/hgfs/VM_Shared/Teselog4cplus/build")
INSTALL(FILES logconfig.property
DESTINATION ${CONFIG_INSTALL_PREFIX})

直接编译命令(可用cmake编译安装):g++ main.cpp -I /usr/local/include/ -L /usr/local/lib -l log4cplus -o main
注意这里使用的是g++,我刚开始使用的是 gcc ,结果无法编译,原因见(https://blog.csdn.net/u013457167/article/details/80222557),如果是多线程,好像还有其他注意事项,有兴趣可以搜索相关内容。

4.测试效果

输入以下命令

./main

如果提示不能打开 liblog4cplus-1.2.so.5 文件,则参考 https://www.cnblogs.com/liyubo/p/10528855.html ,

问题解决后,在当前目录下会有日志文件产生 log.log

==============================================================================================

5.其他注意事项

异常错误

undefined reference to ‘log4cplus::Logger::operator=(log4cplus::Logger&&)

经过搜索发现,原来在编译log4cplus的时候需要添加参数 CXXFLAGS="-std=c++0x",所以完整的命令应如下:

./configure --prefix=/usr/local/ CXXFLAGS="-std=c++0x"

 qt creator 项目中 .pro 文件链接库的方法

unix{#表示Linux环境的特殊设置,这个大括号不能单独放在下一行,否则编译会报错
#在Linux系统Qt开发,这句话不灵,编译可通过,但是程序不可运行,提示找不到库文件
#LIBS += ../bin/libCommunicate.so#包含项目需要用到的共享库,注意文件名多了关键字"lib",扩展名是.so
#LIBS += -L /usr/local/lib -l log4cplus #加载动态库
LIBS += /usr/local/lib/liblog4cplus.a}

log4cplus在Linux下编译及使用的更多相关文章

  1. linux下编译gcc6.2.0

    linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...

  2. LINUX下编译安装PHP各种报错大集合

    本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...

  3. linux下编译安装vim7.4并安装clang_complete插件

    linux下编译安装vim7.4并安装clang_complete插件 因为debian里软件仓库中下载安装的vim是不支持python写的插件的(可以打开vim,在命令模式先输入:py测试一下),导 ...

  4. linux下编译出现空间不足解决办法

    linux下编译出现空间不足解决办法 编译内核出现问题: AS      .tmp_kallsyms1.o .tmp_kallsyms1.S:2: fatal error: when writing ...

  5. linux下编译安装curl

    linux下编译安装curl 1.下载curl git clone https://github.com/curl/curl.git 2.在curl目录下生成configure文件 ./buldcon ...

  6. 如何在Kali Linux下编译Windows Exploit

    前言 微软的Windows在企业或是个人应用领域占据着最大的市场份额,在渗透测试过程中你会经常遇到很多Windows的工作站和服务器.另一方面,大多数渗透测试人员主要使用基于Linux的发行版渗透测试 ...

  7. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  8. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  9. linux下编译安装boost库

    linux下编译安装boost库 linux下编译安装boost库 1.下载并解压boost 1.58 源代码 下载 解压 2.运行bootstrap.sh 3.使用b2进行构建 构建成功的提示 4. ...

随机推荐

  1. PHP AES的加密解密-----【弃用】

    mcrypt_decrypt在PHP7.*已经被弃用,取而代之的是openssl_decrypt/encrypt,请参考: PHP7.* AES的加密解密 AES加密算法 密码学中的高级加密标准(Ad ...

  2. 2.使用RNN做诗歌生成

    诗歌生成比分类问题要稍微麻烦一些,而且第一次使用RNN做文本方面的问题,还是有很多概念性的东西~~~ 数据下载: 链接:https://pan.baidu.com/s/1uCDup7U5rGuIlIb ...

  3. 《XXX重大技术需求征集系统》的可用性和可修改性战术分析

    在网站的界面完整有效的呈现在最终用户面前前,其中经历的每一环节出现问题都会导致网站页面不可访问.原因如,如DNS被劫持.网站交换机失效,硬盘损坏,网卡松掉,机房停电等都可能导致网站不可用(网站故障)情 ...

  4. [转自大神]js拖拽小总结

    https://blog.csdn.net/u013040887/article/details/83059094 权侵删 这里写的是一个原生js实现拖拽的效果,首先: 1.实现拖拽的三大事件,是要首 ...

  5. GA:利用GA对一元函数进行优化过程,求x∈(0,10)中y的最大值——Jason niu

    x = 0:0.01:10; y = x + 10*sin(5*x)+7*cos(4*x); figure plot(x, y) xlabel('independent variable') ylab ...

  6. ECMAScript6 入门-let与const命令

    块级作用域 1:let命令声明的变量只在let命令所在的代码块有效--简而言之 大括号既是代码块,也就是说存在块级作用域了. { let a =10; var b =1; } a // Referen ...

  7. S0.2 灰度图

    目录 灰度图定义 灰度图优点 RGB转灰度算法(OpenCV3) 量化 算法公式 OpenCV自带函数实现 综合比较 灰度图定义 对于单色(灰度)图像而言,每个像素的亮度用一个数值来表示,通常数值范围 ...

  8. LeetCode Monotone Stack Summary 单调栈小结

    话说博主在写Max Chunks To Make Sorted II这篇帖子的解法四时,写到使用单调栈Monotone Stack的解法时,突然脑中触电一般,想起了之前曾经在此贴LeetCode Al ...

  9. FJUT3260

    不是啊..不是说双栈嘛,,怎么是个**题啊. 链接:  http://120.78.128.11/Problem.jsp?pid=3260    从左到右扫一遍,把相交的区间扔到一起算,那么就变成了一 ...

  10. ng7 设置文件路径别名

    /tsconfig.json 配置后重启服务 { "compileOnSave": false, "compilerOptions": { "base ...