• CMake 编译 Log4cplus



    1.从官方下载源码:
    git clone --recurse https://github.com/log4cplus/log4cplus.git
    log4cplus 依赖 catch 和 threadpool, 如果其中一个失败, 可以删除源码根目录对应的文件, 单独下载即可
    举个例子:
    rm -rf threadpool
    git clone https://github.com/log4cplus/ThreadPool.git threadpool
    rm -rf catch
    git clone https://github.com/philsquared/Catch.git catch

    2.编译 msvc 版本库

    (1).切换到源码根目录, 创建一个临时文件夹, 用于 cmake 缓存
    mkdir .build_msvc
    cd .build_msvc

    (2).编译 release 版本, 执行如下命令, 其中 CMAKE_INSTALL_PREFIX 指定库及文件输出路径, 本例中将输出到与源码同级目录
    # cmake -DCMAKE_INSTALL_PREFIX=../../thirdparties/log4cplus/msvc -DCMAKE_DEBUG_POSTFIX=d ..
    cmake -DCMAKE_INSTALL_PREFIX=../../thirdparties/log4cplus/msvc ..
    cmake --build . --config release -j8
    cmake --install .

    如果编译成功, 该目录中有三个子目录, 如下所示:
    -- thirdparties/log4cplus/msvc
    -- bin
    -- include
    -- lib

    (3).编译 debug 版本, 执行如下命令
    # cmake -DCMAKE_INSTALL_PREFIX=../../thirdparties/log4cplus/msvc -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_BUILD_TYPE=Debug ..
    # cmake -DCMAKE_INSTALL_PREFIX=../../thirdparties/log4cplus/msvc -DCMAKE_DEBUG_POSTFIX=d ..
    cmake --build . --config debug -j8
    cmake --install . --config debug

    3.编译 mingw32 版本库
    (1).添加 mingw32/bin 目录到环境变量
    PATH=D:/Qt/Qt5.15.2/Tools/mingw810_32/bin/;%PATH%

    (2).切换到源码根目录, 创建一个临时文件夹, 用于 cmake 缓存
    mkdir .mingw32
    cd .mingw32

    (3).编译 release 版本, 执行如下命令, 其中 CMAKE_INSTALL_PREFIX 指定库及文件输出路径
    cmake.exe -G "MinGW Makefiles" "-DCMAKE_INSTALL_PREFIX:STRING=../../thirdparties/log4cplus/mingw32" "-DCMAKE_MAKE_PROGRAM=mingw32-make.exe" "-DCMAKE_C_COMPILER:STRING=gcc.exe" "-DCMAKE_CXX_COMPILER:STRING=g++.exe" ..
    cmake --build . -j8
    cmake --install .

    (4).编译 debug 版本, 执行如下命令
    cmake.exe -G "MinGW Makefiles" "-DCMAKE_BUILD_TYPE:STRING=Debug" "-DCMAKE_INSTALL_PREFIX:STRING=../../thirdparties/log4cplus/mingw32" "-DCMAKE_MAKE_PROGRAM=mingw32-make.exe" "-DCMAKE_C_COMPILER:STRING=gcc.exe" "-DCMAKE_CXX_COMPILER:STRING=g++.exe" ..
    cmake --build . --config debug -j8
    cmake --install . --config debug

    4.Qt 中使用 log4cplus
    (1).可以直接通过 Qt creator 添加一个环境变量, 其路径为编译时指定的输出路径, 也可以将编译时的整个文件夹拷贝到项目的第三方库路径下
    qt creator add env:
    LOG4CPLUS_DIR 值为 ../../thirdparties/log4cplus/msvc
    或者在 CMakeLists.txt 中添加 cmake 文件路径:
    set(log4cplus_DIR ../thirdparties/msvc/lib/cmake/log4cplus)

    (2).添加 log4plus 库
    find_package(log4cplus REQUIRED)
    target_link_libraries(TestLog4cplus log4cplus::log4cplusU)

    cmake_minimum_required(VERSION 3.14)
    
    project(TestLog4cplus LANGUAGES CXX)
    
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    if (${MSVC})
        message("MSVC")
        set(log4cplus_DIR ../thirdparties/msvc/lib/cmake/log4cplus)
    endif()
    
    if (${MINGW})
        message("MINGW")
        if (not ${CMAKE_CL_64})
        else()
            set(log4cplus_DIR ../thirdparties/mingw32/lib/cmake/log4cplus)
        endif()
    endif()
    
    find_package(log4cplus REQUIRED)
    
    add_executable(TestLog4cplus
        main.cpp
    )
    
    target_link_libraries(TestLog4cplus log4cplus::log4cplusU)
    

      

    #include <map>
    #include <string>
    #include <log4cplus/logger.h>
    #include <log4cplus/configurator.h>
    #include <log4cplus/loggingmacros.h>
    #include <log4cplus/log4cplus.h>
    
    
    int main(int argc, char *argv[])
    {
        (void)(argc);
        (void)(argv);
    
        using namespace log4cplus;
        const int LOOP_COUNT = 20;
    
        Initializer initializer;
    
        Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("test"));
        // logger.setLogLevel(INFO_LOG_LEVEL);
        logger.setLogLevel(ALL_LOG_LEVEL);
    
        tstring pattern = LOG4CPLUS_TEXT("%D{%Y-%m-%d %H:%M:%S.%q} %t %p %l %m%n");
    
        SharedAppenderPtr consoleAppender(new ConsoleAppender);
        consoleAppender->setName(LOG4CPLUS_TEXT("console"));
        // consoleAppender->setLayout(std::unique_ptr<Layout>(new SimpleLayout));
        consoleAppender->setLayout(std::unique_ptr<Layout>(new PatternLayout(pattern)));
        logger.addAppender(consoleAppender);
    
        // 创建最大为200K,最多缓存5个日志文件的对象(总共是6个文件)
        SharedFileAppenderPtr fileAppender(new RollingFileAppender(LOG4CPLUS_TEXT("logs/Test.log"), 200 * 1024, 5, false, true));
        fileAppender->setName(LOG4CPLUS_TEXT("FirstFile"));
        // fileAppender->setLayout( std::unique_ptr<Layout>(new TTCCLayout()));
        fileAppender->setLayout(std::unique_ptr<Layout>(new PatternLayout(pattern)));
        // fileAppender->getloc();
        logger.addAppender(SharedAppenderPtr(fileAppender.get()));
    
        for (int i = 0; i < LOOP_COUNT; ++i) {
            LOG4CPLUS_DEBUG(logger, "Entering loop #" << i);
        }
    
        LOG4CPLUS_TRACE(logger, ("Hello trace"));
        LOG4CPLUS_DEBUG(logger, ("Hello debug"));
        LOG4CPLUS_INFO(logger, ("Hello info"));
        LOG4CPLUS_WARN(logger, ("Hello warn"));
        LOG4CPLUS_ERROR(logger, ("Hello error"));
        LOG4CPLUS_FATAL(logger, ("Hello fatal"));
        LOG4CPLUS_ASSERT(logger, ("Hello assert"));
    
        std::string str("Hello std::string info");
        LOG4CPLUS_INFO(logger, str.data());
    
        return 0;
    }
    

      

    代码养活自己
  • 相关阅读:
    RS485通信和Modbus协议(转)
    Modbus通讯错误检测方法
    Modbus消息帧
    Modbus通讯两种传输方式
    echarts自定义图例legend文字和样式
    host文件的作用
    webpack --watch和supervisor的不同
    vue中如何使用echarts
    Vue父子组件生命周期
    Git总结笔记
  • 原文地址:https://www.cnblogs.com/diysoul/p/15203977.html
Copyright © 2020-2023  润新知