Apache log4cxx 1.8.0 源码构建与集成实战详解

基于Ubuntu 22.04实测log4cxx 1.8.0源码下载校验、CMake构建安装与三个可运行示例的完整流程。

Apache log4cxxlog4cxxApacheC/C++日志2026/10/15

Apache log4cxx 1.8.0 源码构建与集成实战详解

目标:在 Ubuntu 22.04 上从零完成 log4cxx 1.8.0 的依赖安装、官方源码下载与 sha512 校验、CMake 编译安装,并通过三个可运行 C++ 示例(BasicConfigurator、properties+滚动文件、XML+JSON/XML 布局)验证集成。全程命令与回显已在 Ubuntu 22.04 实测通过。

一、环境信息

项目说明
操作系统Ubuntu 22.04.5 LTS
架构x86_64
编译器g++ 11.4.0
构建工具CMake 3.22.1
组件版本log4cxx 1.8.0、APR 1.7.0、APR-Util 1.6.1
目录源码 /opt/log4cxx/apache-log4cxx-1.8.0,示例 /opt/log4cxx/demo,集成示例 /opt/log4cxx/cmakedemo,安装前缀 /usr/local

逐项说明:root 账号执行;构建机 12 核,编译 12 并发约 2 分钟;如网络受限,wget 与 apt 可经代理转发。

二、前置依赖

log4cxx 运行期依赖 APR 与 APR-Util,构建期还需要 CMake、C++ 编译器与测试工具。安装命令与实测回显:

apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential cmake wget libapr1-dev libaprutil1-dev zip

安装完成尾部回显:

Setting up libalgorithm-diff-xs-perl (0.04-6build3) ...
Setting up libalgorithm-merge-perl (0.08-3) ...
Processing triggers for libc-bin (2.35-0ubuntu3.14) ...
Processing triggers for ca-certificates (20260601~22.04.1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

逐项解说:build-essential 提供 g++ 与 make;libapr1-dev/libaprutil1-dev 提供 APR 头文件与 apr-1-config;zip 是 log4cxx 测试套件的硬依赖(缺它 CMake 配置直接失败,见 FAQ Q2)。版本验证:

cmake --version | head -1
g++ --version | head -1
dpkg -l | grep -E 'libapr1-dev|libaprutil1-dev'

实测回显:

cmake version 3.22.1
g++ (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0
ii  libapr1-dev  1.7.0-8ubuntu0.22.04.2  amd64  Apache Portable Runtime Library - Development Headers
ii  libaprutil1-dev  1.6.1-5ubuntu4.22.04.3  amd64  Apache Portable Runtime Utility Library - Development Headers

三、源码下载与完整性校验

官方发行目录 https://dlcdn.apache.org/logging/log4cxx/1.8.0/ 下同时提供 tar.gz 与 sha512 校验文件,下载后必须校验:

mkdir -p /opt/log4cxx && cd /opt/log4cxx
wget https://dlcdn.apache.org/logging/log4cxx/1.8.0/apache-log4cxx-1.8.0.tar.gz
wget https://dlcdn.apache.org/logging/log4cxx/1.8.0/apache-log4cxx-1.8.0.tar.gz.sha512
sha512sum -c apache-log4cxx-1.8.0.tar.gz.sha512
ls -la

实测回显:

apache-log4cxx-1.8.0.tar.gz: OK
total 928
drwxr-xr-x 2 root root   4096 Oct 14 16:45 .
drwxr-xr-x 1 root root   4096 Oct 14 16:45 ..
-rw-r--r-- 1 root root 934518 Jul 28 21:54 apache-log4cxx-1.8.0.tar.gz
-rw-r--r-- 1 root root    158 Jul 28 21:54 apache-log4cxx-1.8.0.tar.gz.sha512

逐项解说:源码包仅 934518 字节(约 0.9 MB),sha512 校验输出 OK 表示文件与官方一致;若输出 FAILED 须重新下载。解压:

cd /opt/log4cxx && tar -xzf apache-log4cxx-1.8.0.tar.gz && ls

实测回显:

apache-log4cxx-1.8.0
apache-log4cxx-1.8.0.tar.gz
apache-log4cxx-1.8.0.tar.gz.sha512

四、CMake 编译与安装

4.1 配置

cd /opt/log4cxx/apache-log4cxx-1.8.0
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local

首次配置在探测测试工具时报错(实测):

CMake Error at src/test/cpp/CMakeLists.txt:43 (find_program):
  Could not find ZIP_APP using the following names: zip

-- Configuring incomplete, errors occurred!

排障:log4cxx 测试套件需要 zip 程序,安装后重新配置:

DEBIAN_FRONTEND=noninteractive apt-get install -y zip
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local

配置成功回显(实测节选,首尾):

-- The CXX compiler identification is GNU 11.4.0
-- Found APR: -L/usr/lib/x86_64-linux-gnu;-lapr-1
-- Found APR-Util: -L/usr/lib/x86_64-linux-gnu;-laprutil-1
-- Log4cxx configuration summary:
--   C++ compiler .................... : /usr/bin/c++
--   Build shared library ............ : ON
--   Install prefix .................. : /usr/local
--   log4cxx char type ............... : utf-8
--   Async Appender .................. : ON
--   ConsoleAppender ................. : ON
--   FileAppender .................... : ON
--   RollingFileAppender ............. : ON
--   JSONLayout ...................... : ON
--   PatternLayout ................... : ON
--   FMTLayout ....................... : OFF
-- Configuring done
-- Generating done
-- Build files have been written to: /opt/log4cxx/apache-log4cxx-1.8.0/build

逐项解说:Found APR/APR-Util 表明依赖检测通过;摘要确认异步、控制台、文件、滚动 Appender 与 JSON/Pattern 布局全部启用;FMTLayout 为 OFF 是因为系统未装 fmt 开发库,不影响其它功能。

4.2 编译与安装

cmake --build build -j12
cmake --install build

编译尾部与安装关键回显(实测节选):

[100%] Built target MyApp1
[100%] Linking CXX executable MyApp2
[100%] Built target custom-appender
[100%] Built target timebasedrollingtest
-- Installing: /usr/local/lib/liblog4cxx.so.15.8.0
-- Installing: /usr/local/lib/liblog4cxx.so.15
-- Installing: /usr/local/lib/liblog4cxx.so
-- Installing: /usr/local/lib/pkgconfig/liblog4cxx.pc
-- Installing: /usr/local/lib/cmake/log4cxx/log4cxxTargets.cmake
-- Installing: /usr/local/lib/cmake/log4cxx/log4cxxTargets-release.cmake
-- Installing: /usr/local/lib/cmake/log4cxx/log4cxxConfig.cmake
-- Installing: /usr/local/lib/cmake/log4cxx/log4cxxConfigVersion.cmake

验证安装并刷新动态库缓存:

ldconfig
ls -la /usr/local/lib/liblog4cxx.so* && ldd /usr/local/lib/liblog4cxx.so.15.8.0 | head -6

实测回显:

lrwxrwxrwx 1 root root      16 Oct 14 16:50 /usr/local/lib/liblog4cxx.so -> liblog4cxx.so.15
lrwxrwxrwx 1 root root      20 Oct 14 16:50 /usr/local/lib/liblog4cxx.so.15 -> liblog4cxx.so.15.8.0
-rw-r--r-- 1 root root 3515416 Oct 14 16:49 /usr/local/lib/liblog4cxx.so.15.8.0
        linux-vdso.so.1 (0x00007fffa13fa000)
        libaprutil-1.so.0 => /lib/x86_64-linux-gnu/libaprutil-1.so.0 (0x00007e6a7fff5000)
        libapr-1.so.0 => /lib/x86_64-linux-gnu/libapr-1.so.0 (0x00007e6a7ffb8000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007e6a7fd8c000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007e6a7fd6c000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007e6a7fb43000)

逐项解说:主库 3.5 MB;Soname 主版本 15 对应 log4cxx 1.x API;运行期链接 APR/APR-Util 与 C++ 标准库,无其它强依赖。

五、第一个可运行示例(BasicConfigurator)

💡 技术拓展:log4cxx 提供三种起步姿势——BasicConfigurator 零配置直挂控制台、PropertyConfigurator 读 properties、xml::DOMConfigurator 读 XML。本文按由简到繁依次实测三种,生产推荐 XML 或 properties 文件驱动。

创建示例目录并写入 demo1.cpp:

mkdir -p /opt/log4cxx/demo && cd /opt/log4cxx/demo
// demo1.cpp  文件:/opt/log4cxx/demo/demo1.cpp
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <iostream>

int main(int argc, char** argv)
{
    try
    {
        log4cxx::BasicConfigurator::configure();
        log4cxx::LoggerPtr rootLogger = log4cxx::Logger::getRootLogger();
        rootLogger->setLevel(log4cxx::Level::getDebug());

        log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("com.example.demo");
        LOG4CXX_DEBUG(logger, "调试信息:订单服务启动参数加载完成");
        LOG4CXX_INFO(logger, "普通信息:用户 admin 于 2026-10-15 登录系统");
        LOG4CXX_WARN(logger, "警告信息:磁盘使用率已达 82%");
        LOG4CXX_ERROR(logger, "错误信息:连接数据库失败,重试第 1 次");
        LOG4CXX_FATAL(logger, "严重信息:服务进程即将退出");
        return 0;
    }
    catch (const log4cxx::helpers::Exception& e)
    {
        std::cerr << "log4cxx 异常: " << e.what() << std::endl;
        return 1;
    }
}

编译并运行:

g++ -std=c++17 demo1.cpp -o demo1 -I/usr/local/include -L/usr/local/lib -llog4cxx -lapr-1 -laprutil-1
LD_LIBRARY_PATH=/usr/local/lib ./demo1

实测输出:

0 [0x7cd91d4b8840] DEBUG com.example.demo null - 调试信息:订单服务启动参数加载完成
0 [0x7cd91d4b8840] INFO com.example.demo null - 普通信息:用户 admin 于 2026-10-15 登录系统
0 [0x7cd91d4b8840] WARN com.example.demo null - 警告信息:磁盘使用率已达 82%
0 [0x7cd91d4b8840] ERROR com.example.demo null - 错误信息:连接数据库失败,重试第 1 次
0 [0x7cd91d4b8840] FATAL com.example.demo null - 严重信息:服务进程即将退出

逐项解说:BasicConfigurator 默认模式为 %r [%t] %p %c %x - %m%n——0 是进程启动毫秒数,0x7cd91d4b8840 是线程地址,null 是空的 NDC 上下文;五个级别全部输出,因为代码里把 root 级别调到了 DEBUG。LD_LIBRARY_PATH 指向安装前缀,生产环境可将 /usr/local/lib 写入 ld.so.conf 或设置 rpath。

六、进阶实战

6.1 properties 配置 + RollingFileAppender 滚动实测

先写配置文件 /opt/log4cxx/demo/log4j.properties:

log4j.rootLogger=DEBUG, console, rolling
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c - %m%n
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.File=/opt/log4cxx/demo/app.log
log4j.appender.rolling.MaxFileSize=10KB
log4j.appender.rolling.MaxBackupIndex=3
log4j.appender.rolling.Append=true
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

逐项解说:root 同时挂 console 与 rolling;console 模板带毫秒,rolling 模板带完整时间戳;MaxFileSize=10KB 表示单文件超过 10 KB 滚动,MaxBackupIndex=3 最多保留 3 个历史文件;Append=true 追加写。

demo2.cpp:

// demo2.cpp  文件:/opt/log4cxx/demo/demo2.cpp
#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/rolling/rollingfileappender.h>
#include <iostream>

int main(int argc, char** argv)
{
    log4cxx::PropertyConfigurator::configure("/opt/log4cxx/demo/log4j.properties");
    log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("OrderService");
    log4cxx::LoggerPtr daoLogger = log4cxx::Logger::getLogger("OrderService.Dao");

    daoLogger->setLevel(log4cxx::Level::getInfo());
    for (int i = 1; i <= 120; i++)
    {
        LOG4CXX_INFO(logger, "滚动压测第 " << i << " 条:订单 1001 状态更新为 PAID");
    }
    LOG4CXX_DEBUG(daoLogger, "这条 DEBUG 会被子 logger 的 INFO 级别过滤掉");
    LOG4CXX_INFO(daoLogger, "Dao 层 INFO:查询订单 1001 成功");
    std::cout << "已写入 120 条 INFO 日志" << std::endl;
    return 0;
}
g++ -std=c++17 demo2.cpp -o demo2 -I/usr/local/include -L/usr/local/lib -llog4cxx -lapr-1 -laprutil-1
LD_LIBRARY_PATH=/usr/local/lib ./demo2

控制台输出节选(实测首尾):

2026-10-14 16:54:04.007 [0x7f6a0d5a6840] INFO  OrderService - 滚动压测第 1 条:订单 1001 状态更新为 PAID
2026-10-14 16:54:04.008 [0x7f6a0d5a6840] INFO  OrderService - 滚动压测第 120 条:订单 1001 状态更新为 PAID
2026-10-14 16:54:04.008 [0x7f6a0d5a6840] INFO  OrderService.Dao - Dao 层 INFO:查询订单 1001 成功
已写入 120 条 INFO 日志

子 Logger 级别过滤验证:daoLogger 的 DEBUG 在输出中不存在,说明被 INFO 有效级别拦截。滚动文件验证:

ls -la /opt/log4cxx/demo/*.log* && head -1 /opt/log4cxx/demo/app.log && head -1 /opt/log4cxx/demo/app.log.1 && tail -1 /opt/log4cxx/demo/app.log.1

实测回显:

-rw-r--r-- 1 root root  4207 Oct 14 16:54 /opt/log4cxx/demo/app.log
-rw-r--r-- 1 root root 10311 Oct 14 16:54 /opt/log4cxx/demo/app.log.1
2026-10-14 16:54:04,008 [0x7f6a0d5a6840] INFO  OrderService - 滚动压测第 87 条:订单 1001 状态更新为 PAID
2026-10-14 16:54:04,007 [0x7f6a0d5a6840] INFO  OrderService - 滚动压测第 1 条:订单 1001 状态更新为 PAID
2026-10-14 16:54:04,008 [0x7f6a0d5a6840] INFO  OrderService - 滚动压测第 86 条:订单 1001 状态更新为 PAID

逐项解说:第 1~86 条滚入 app.log.1(10311 字节,超过 10 KB 触发滚动),第 87 条起写入新 app.log;MaxBackupIndex=3 允许再多存 3 个历史,本次压测只滚 1 次所以仅 app.log.1 一个历史文件。

6.2 XML 配置 + JSONLayout/XMLLayout 实测

<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="jsonAppender" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.JSONLayout">
      <param name="LocationInfo" value="true"/>
      <param name="PrettyPrint" value="false"/>
    </layout>
  </appender>
  <appender name="xmlAppender" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.xml.XMLLayout"/>
  </appender>
  <logger name="JsonDemo" additivity="false">
    <level value="INFO"/>
    <appender-ref ref="jsonAppender"/>
  </logger>
  <logger name="XmlDemo" additivity="false">
    <level value="INFO"/>
    <appender-ref ref="xmlAppender"/>
  </logger>
  <root>
    <level value="WARN"/>
    <appender-ref ref="xmlAppender"/>
  </root>
</log4j:configuration>

逐项解说:JSONLayout 开 LocationInfo 后输出会带 location_info 字段;两个业务 Logger 用 additivity="false" 防止事件再传给 root 造成重复输出。

demo3.cpp:

// demo3.cpp  文件:/opt/log4cxx/demo/demo3.cpp
#include <log4cxx/logger.h>
#include <log4cxx/xml/domconfigurator.h>
#include <iostream>

int main(int argc, char** argv)
{
    log4cxx::xml::DOMConfigurator::configure("/opt/log4cxx/demo/log4cxx.xml");
    log4cxx::LoggerPtr jsonLogger = log4cxx::Logger::getLogger("JsonDemo");
    log4cxx::LoggerPtr xmlLogger = log4cxx::Logger::getLogger("XmlDemo");
    log4cxx::MDC::put("userId", "admin");
    LOG4CXX_INFO(jsonLogger, "JSON 布局输出:订单 1001 已支付");
    LOG4CXX_WARN(jsonLogger, "JSON 布局输出:库存低于安全阈值");
    LOG4CXX_ERROR(xmlLogger, "XML 布局输出:消息队列连接超时");
    log4cxx::MDC::remove("userId");
    return 0;
}
g++ -std=c++17 demo3.cpp -o demo3 -I/usr/local/include -L/usr/local/lib -llog4cxx -lapr-1 -laprutil-1
LD_LIBRARY_PATH=/usr/local/lib ./demo3

实测输出:

{ "timestamp": "2026-10-14 16:54:29,408", "level": "INFO", "logger": "JsonDemo", "message": "JSON 布局输出:订单 1001 已支付", "context_map": { "userId": "admin" }, "location_info": { "file": "demo3.cpp", "line": "11", "class": "", "method": "main" } }
{ "timestamp": "2026-10-14 16:54:29,408", "level": "WARN", "logger": "JsonDemo", "message": "JSON 布局输出:库存低于安全阈值", "context_map": { "userId": "admin" }, "location_info": { "file": "demo3.cpp", "line": "12", "class": "", "method": "main" } }
<log4j:event logger="XmlDemo" timestamp="1791996869408" level="ERROR" thread="0x7466abb3f840">
<log4j:message><![CDATA[XML 布局输出:消息队列连接超时]]></log4j:message>
</log4j:event>

逐项解说:JSONLayout 单行输出便于日志采集器按行解析;MDC 写入的 userId 出现在 context_map;location_info 因 LocationInfo=true 而带出源文件与行号。XMLLayout 输出 log4j:event 元素,timestamp 为毫秒级 epoch,适合老牌 Chainsaw 工具消费。

6.3 CMake 项目集成(find_package)

生产项目推荐 CMake 集成而非手写 g++ 参数。目录 /opt/log4cxx/cmakedemo 下两个文件:

// main.cpp
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>

int main()
{
    log4cxx::BasicConfigurator::configure();
    log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("CMakeDemo");
    LOG4CXX_INFO(logger, "CMake find_package 集成 log4cxx 成功");
    return 0;
}
# CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(cmakedemo CXX)
set(CMAKE_CXX_STANDARD 17)
find_package(log4cxx CONFIG REQUIRED)
add_executable(cmakedemo main.cpp)
target_link_libraries(cmakedemo PRIVATE log4cxx)
cd /opt/log4cxx/cmakedemo
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
LD_LIBRARY_PATH=/usr/local/lib ./build/cmakedemo

实测回显:

-- Configuring done
-- Generating done
-- Build files have been written to: /opt/log4cxx/cmakedemo/build
[100%] Linking CXX executable cmakedemo
[100%] Built target cmakedemo
0 [0x790146cc8840] INFO CMakeDemo null - CMake find_package 集成 log4cxx 成功

逐项解说:find_package(log4cxx CONFIG REQUIRED) 消费的是安装时落盘的 log4cxxConfig.cmake,目标名 log4cxx 即携带头文件路径与链接依赖,无需再手写 -lapr-1。

七、常见问题(FAQ)

Q1:cmake 配置报 Could not find ZIP_APP using the following names: zip 怎么办? A:测试套件需要 zip/sed/gzip,Ubuntu 22.04 默认无 zip。执行 apt install zip 后重新配置即可(本文 4.1 节已实测);不跑测试也可加 -DLOG4CXX_TEST=OFF。

Q2:运行示例报 error while loading shared libraries: liblog4cxx.so.15: cannot open shared object file 怎么办? A:安装路径 /usr/local/lib 不在默认搜索链或未刷新缓存。执行 ldconfig;临时方案是运行时带 LD_LIBRARY_PATH=/usr/local/lib(本文所有示例如此),长期方案把 /usr/local/lib 加入 ld.so.conf.d 或为可执行文件设置 INSTALL_RPATH。

Q3:手写 g++ 编译时链接哪些库? A:至少 -llog4cxx;直接编译(非 CMake 导入)时显式补上 -lapr-1 -laprutil-1 最稳,实测命令 g++ -std=c++17 demo1.cpp -o demo1 -I/usr/local/include -L/usr/local/lib -llog4cxx -lapr-1 -laprutil-1。用 find_package 则自动处理。

Q4:demo2 里子 Logger 的 DEBUG 为什么三个输出端都没有? A:Logger 级别在事件构造前拦截,属于零开销过滤——daoLogger 被设为 INFO 后 DEBUG 事件根本不会产生,与 Appender 数量无关。要单独给某个输出端开 DEBUG,应把 Logger 级别设为 DEBUG 并在该 Appender 上用 Threshold 收紧。

Q5:app.log.1 是怎么来的?文件名规则能改吗? A:RollingFileAppender 滚动时把旧文件改名为 基名.序号(app.log.1),这是默认规则;10 KB 触发、最多 3 个历史由 MaxFileSize/MaxBackupIndex 控制。需要按日期滚动请改用 DailyRollingFileAppender 并配置 DatePattern。

Q6:JSONLayout 输出会带源文件行号吗?如何开启? A:会,把 JSONLayout 的 LocationInfo 参数设为 true,实测输出 location_info 字段含 file/line/method。代价是每条日志要抓取调用点信息,高频路径慎用。

Q7:properties 配置里写了 Filter 为什么不生效? A:实测结论:1.8.0 的 PropertyConfigurator 不解析 Filter(源码中无对应分支),Filter 只能通过 XML 配置(DOMConfigurator)挂载。properties 里写 filter 键会被静默忽略,这是排障时很容易踩的坑。

Q8:异步日志怎么开?顺序会乱吗? A:挂 org.apache.log4j.AsyncAppender 并用 appender-ref 把真实 Appender 挂到它下面,BufferSize 控制环形缓冲、Blocking 控制打满策略。实测 demo5 中 5 条日志先入队(0.000129 秒)后由后台线程刷出,std::cout 先于日志行出现——单线程内事件顺序保持,但与进程内其它输出流的相对顺序不再有保证。

Q9:怎么验证安装的库确实是 1.8.0? A:看安装产物 Soname(liblog4cxx.so.15.8.0 即 1.8.0 的库版本)或 CMake 摘要,也可以调用 log4cxx::Version 常量;最简单的是看 /usr/local/lib/cmake/log4cxx/log4cxxConfigVersion.cmake 中记录的版本号。

Q10:想裁掉网络和数据库模块减小体积怎么办? A:CMake 提供细粒度开关,如 -DLOG4CXX_NETWORKING_SUPPORT=OFF 可去掉 Syslog/XMLSocket/Telnet 等网络 Appender;本机默认配置下 ODBC/SMTP Appender 已是 OFF(摘要可见)。裁剪后重新编译安装,头文件与 CMake 配置自动同步。

八、参考链接

  1. log4cxx 官方下载目录(1.8.0):https://dlcdn.apache.org/logging/log4cxx/1.8.0/
  2. log4cxx 快速开始文档:https://logging.apache.org/log4cxx/latest_stable/quick-start.html
  3. CMake find_package 机制说明:https://cmake.org/cmake/help/latest/command/find_package.html
  4. APR 下载与文档:https://apr.apache.org/download.cgi
  5. log4cxx 源码仓库:https://github.com/apache/logging-log4cxx