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. 剑指offer字符串1

    面试题5:替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. class Solu ...

  2. SSL通信-忽略证书认证错误

    .NET的SSL通信过程中,使用的证书可能存在各种问题,某种情况下可以忽略证书的错误继续访问.可以用下面的方式跳过服务器证书验证,完成正常通信. 1.设置回调属性ServicePointManager ...

  3. Javascript我学之三函数的参数

    本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘 函数的参数             对于参数值,JavaScript不会进行类型检查,任何类型的值都可以被传递给参数.             ...

  4. Ubuntu16.04安装VS Code

    1. 官网下载VS Code安装包, 如名字为 vscodename.deb 2. 在 vscodename.deb 所在的文件夹打开 Terminal,输入 sudo dpkg -i vscoden ...

  5. [转] Brook 搭建教程

    https://www.jiongjun.cc/technology/500.html 在搭建 brook 代理之前,首先要求你要有一台国外 vps,关于国外 vps 选择,可以参考这篇:推荐几款国外 ...

  6. cookie报错

    错误: java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value 原因 ...

  7. Codeforces 431E Chemistry Experiment 线段树 + 二分

    Chemistry Experiment 维护一个权值线段树,然后二分答案. #include<bits/stdc++.h> #define LL long long #define LD ...

  8. Python 求点到直线的垂足

    Python 求点到直线的垂足 在已知一个点,和一条已知两个点的直线的情况下 运算公式参考链接:https://www.cnblogs.com/mazhenyu/p/3508735.html def ...

  9. if的{}的省略

    if (表达式) 语句; else if(表达式) 语句; else if(表达式) 语句; else 语句; 对应: if (表达式) { 语句1; 语句2; 语句N;//多个语句组成代码块 } e ...

  10. ECMAScript 6 字符串的扩展

    1.字符的Unicode表示法 ① JavaScript允许采用\uxxxx的形式来表示一个字符,其中xxxx表示字符的Unicode码点. 但是,这种表示方法有一个局限性,它的码点只能在\u0000 ...