编写自定义 log4cxx 策略,链接器找不到 log4cxx::helper::Object::cast

Writing custom log4cxx policy, linker can't find log4cxx::helper::Object::cast

提问人:metageek 提问时间:8/9/2022 最后编辑:metageek 更新时间:8/11/2022 访问量:66

问:

我正在使用 log4cxx 0.10.0,我需要每小时滚动一次或当文件大小过大时滚动。我最初的尝试是将 rollingPolicy 配置为 TimeBasedRollingPolicy,将 triggerPolicy 配置为 SizeBasedTriggeringPolicy;但这行不通,因为 TBRP 也是一种触发策略。因此,我编写了一个 SizeAndTimePolicy 类,该类继承自 TriggeringPolicy 和 RollingPolicy,包含 TBRP 和 SBTP,并委托给它们。它编译,但在链接时我收到以下错误消息:

/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: util/libutil_lib.a(CustomLogPolicies.cpp.o):在函数中 'log4cxx::rolling::SizeAndTimePolicy::cast(log4cxx::helpers::类 const&) const': /home/jstracke/git/scidb/include/util/CustomLogPolicies.h:23: 未定义对 'log4cxx::helpers::Object::cast(log4cxx::helpers::Class const&) 常量'

果不其然,/usr/lib64/liblog4cxx.so.10.0.0 上的 nm -D 找不到该符号。它找到的最接近的是_ZNK7log4cxx7helpers10ObjectPtrTINS0_6ObjectEE4castERKNS0_5ClassE。

它所指的行是 LOG4CXX_CAST_ENTRY_CHAIN(RollingPolicy)。有趣的是,它没有抱怨上一行,即 LOG4CXX_CAST_ENTRY_CHAIN(TriggeringPolicy)。

我已经检查了我的链接行,以确保 -llog4cxx 位于我的 CustomLogPolicies.cpp.o 之后。

我在 CentOS 7 上(这就是为什么我卡在 log4cxx 0.10.0 上的原因)。而且,是的,C7 很古老;但我们还不能完全摆脱它。我们即将推出更现代的发行版,但我们可能还需要支持 C7 更长的时间。

任何帮助将不胜感激。

(编辑补充:我已经构建了 0.13.0,它给了我同样的问题。

C++ CentOS7 日志4CXx

评论


答:

0赞 metageek 8/11/2022 #1

我找到了一个解决方法,但我不喜欢它:我编辑了 log4cxx 0.13.0 以赋予 Object::cast() 一个实现,而不是纯粹的虚拟,并创建了一个 object.cpp 文件来包含它。我还把虚拟析构函数放在了那个文件中;它以前是内联的,效果不太好,因为包含虚拟析构函数的文件是包含 vtable 的文件。