我很难使我的代码段在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上运行,没有问题。
这似乎是a C++ standard library ABI mismatch;不匹配的符号demangle到:
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 ++上运行。