我使用的是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::Class const&) const': /home/jstracke/git/scidb/include/util/CustomLogPolicies.h:23: undefined reference tolog4cxx::helpers::Object::cast(log4cxx::helpers::Class const&)
当然,nm /usr/lib64 64/liblog4cxx.so.10.0.0上的-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,它给了我同样的问题。)
发布于 2022-08-10 16:02:17
我找到了一个解决办法,但我不喜欢它:我编辑了log4cxx 0.13.0以给Object::cast()一个实现,而不是纯虚拟的,并创建了一个包含它的object.cpp文件。我还将虚拟析构函数放在该文件中;它以前是内联的,但工作不太好,因为包含虚拟析构函数的文件就是包含vtable的文件。
https://stackoverflow.com/questions/73294330
复制相似问题