未定义符号-在centos 7中使用log4cxx

我很难使我的代码段在centos 7上运行。

因此,我将这些软件包安装在包装盒上:

log4cxx.x86_64,log4cxx-devel.x86_64,apr.x86_64,apr-devel.x86_64, apr-util.x86_64,apr-util-devel.x86_64,glib2.x86_64, glib2-devel.x86_64

在CMakeList.txt中,我尝试了一堆组合(成功构建),但是在执行二进制文件时却得到了相同的结果。

当前,我有这个:

find_package(PkgConfig)
find_library(LOG4CXX_libraRY log4cxx)

尽管我很肯定它可以找到该库,但我也尝试过:

-llog4cxx -lapr-1 -laprutil-1 -lexpat -lglib-2.0

我用这两个配置构建,当我运行可执行文件输出时,我会得到:

undefined symbol: _ZN7log4cxx3xml15DOMConfigurator9configureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

'nm'输出为:

$ nm -D /usr/lib64/liblog4cxx.so | grep _ZN7log4cxx3xml15DOMConfigurator9configure
00000000000f9ff0 T _ZN7log4cxx3xml15DOMConfigurator9configureERKSbIwSt11char_traitsIwESaIwEE
00000000000f9e40 T _ZN7log4cxx3xml15DOMConfigurator9configureERKSs

在我的.cpp文件中,我基本上是这样使用的:

try {
    log4cxx::xml::DOMConfigurator::configure("/root/1.xml");
}
catch (log4cxx::helpers::Exception&) {
    fprintf( stderr,"Error on loading Log-config file" );
    return -1;
}

ps:同一项目可以编译并在FreeBSD 12上运行,没有任何问题。

dunhuangheisha 回答:未定义符号-在centos 7中使用log4cxx

这似乎是a C++ standard library ABI mismatchdemangle不匹配的符号为:

log4cxx::xml::DOMConfigurator::configure(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const&)
log4cxx::xml::DOMConfigurator::configure(std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> > const&)

您的评论表明您正在C ++ 17模式下使用GCC 10。 CentOS 7附带了更老的GCC 4.8.5(甚至不支持C ++ 17),并且早于GCC 5.1(上面的第一个链接)将ABI更改为std::basic_string

您已安装的预构建库将由“默认” CentOS 7工具链构建。

乍一看,我建议您从源代码构建依赖关系,以便所有内容都使用相同的工具链构建。

使用某些黑客工具(例如_GLIBCXX_USE_CXX11_ABI宏)可以使两者正确对齐,但是如果这样的话,您需要其他人的帮助。

char / wchar_t的不匹配也很有趣,尽管我怀疑这只是基于出现错误的顺序的红鲱鱼。)

,

您使用C ++ 17标记了问题,但是centos-7的默认编译器很旧。您可以至少从scl(softwarecollections)使用devtoolset-8安装gcc-8。 devtoolset-8 for centos 7

您还可以使用定义_GLIBCXX_USE_CXX11_ABI=0禁用新的ABI。使用此定义编译的代码可在没有新ABI的旧libstdc ++上运行。

本文链接:https://www.f2er.com/2301260.html

大家都在问