log4cplus在Linux下编译及使用
2019-03-14 11:04 清晨、午后 阅读(5500) 评论(0) 编辑 收藏 举报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=[" << 2 << "]"); LOG4CPLUS_DEBUG(myLoger->m_loggerWJ, " Service is removed"); LOG4CPLUS_DEBUG(myLoger->m_loggerUI, " Service "); return 0; }
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=2 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.1=log4cplus::spi::LogLevelRangeFilter log4cplus.appender.rootLogger.filters.1.LogLevelMin=TRACE log4cplus.appender.rootLogger.filters.1.LogLevelMax=FATAL log4cplus.appender.rootLogger.filters.1.AcceptOnMatch=true log4cplus.appender.rootLogger.filters.2=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.1=log4cplus::spi::LogLevelRangeFilter log4cplus.appender.loggerYW.filters.1.LogLevelMin=TRACE log4cplus.appender.loggerYW.filters.1.LogLevelMax=FATAL log4cplus.appender.loggerYW.filters.1.AcceptOnMatch=true log4cplus.appender.loggerYW.filters.2=log4cplus::spi::DenyAllFilter log4cplus.appender.loggerYW.MaxFileSize=100MB log4cplus.appender.loggerYW.MaxBackupIndex=2 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.1=log4cplus::spi::LogLevelRangeFilter log4cplus.appender.loggerWJ.filters.1.LogLevelMin=TRACE log4cplus.appender.loggerWJ.filters.1.LogLevelMax=FATAL log4cplus.appender.loggerWJ.filters.1.AcceptOnMatch=true log4cplus.appender.loggerWJ.filters.2=log4cplus::spi::DenyAllFilter log4cplus.appender.loggerWJ.MaxFileSize=100MB log4cplus.appender.loggerWJ.MaxBackupIndex=2 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.1=log4cplus::spi::LogLevelRangeFilter log4cplus.appender.loggerUI.filters.1.LogLevelMin=TRACE log4cplus.appender.loggerUI.filters.1.LogLevelMax=FATAL log4cplus.appender.loggerUI.filters.1.AcceptOnMatch=true log4cplus.appender.loggerUI.filters.2=log4cplus::spi::DenyAllFilter log4cplus.appender.loggerUI.MaxFileSize=100MB log4cplus.appender.loggerUI.MaxBackupIndex=2 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}