我遇到这个奇怪的问题,试图在C ++中添加对boost模块的引用。首先,您需要知道我在玩C ++,所以也许这是我错过的超级新手。
这是我的环境,因此您可以获得更多上下文:Mac OS Mavericks,其MacPorts端口具有boost 1.55和g ++-mp-4.8。我目前正在链接和使用boost_system-mt
和boost_filesystem-mt
。
事情是我在一个正在进行的项目中工作,并且一直在使用boost和编译良好。我试图将utf8
字符串转换为Latin1
,所以我包括boost/locale.hpp
,并将其添加-lboost_locale-mt
到链接器参数中。对于我正在执行的任务:
boost::locale::conv::from_utf<char>(value, "Latin1")
到目前为止,它编译良好,但是当完成链接时,出现以下错误:
Undefined symbols for architecture x86_64:
"std::basic_string<char, std::char_traits<char>, std::allocator<char> > boost::locale::conv::from_utf<char>(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::locale::conv::method_type)", referenced from:
clsByteQueue::WriteUnicodeStringFixed(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in clsByteQueue.o
clsByteQueue::WriteUnicodeString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in clsByteQueue.o
ld: symbol(s) not found for architecture x86_64
链接器正在使用以下命令运行:
g++-mp-4.8 -fstack-protector -ggdb -o "bin/foobar" <all compiled.o files goes here> -L/opt/local/lib/ -levent -levent_core -levent_extra -lboost_system-mt -lboost_filesystem-mt -lboost_locale-mt
事情是,我检查了它/opt/local/lib/libboost_locale-mt.a
是否存在,而且也针对正确的体系结构进行了编译:
$ lipo -info /opt/local/lib/libboost_locale-mt.a
input file /opt/local/lib/libboost_locale-mt.a is not a fat file
Non-fat file: /opt/local/lib/libboost_locale-mt.a is architecture: x86_64
另外,我在文件中搜索from_utf,并出现以下符号:
$ otool -tv /opt/local/lib/libboost_locale-mt.a | grep from_utf
__ZN5boost6locale4conv8from_utfIcEENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPKT_SC_RKS9_NS1_11method_typeE:
使用解开它之后,c++filt
我可以验证链接器没有找到相同的符号(除非__1意味着什么?):
$ c++filt __ZN5boost6locale4conv8from_utfIcEENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPKT_SC_RKS9_NS1_11method_typeE
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > boost::locale::conv::from_utf<char>(char const*, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, boost::locale::conv::method_type)
所以,到目前为止,我几乎一无所知。
你们可以帮助我找出问题所在,或者至少我可以尝试其他问题吗?
提前致谢。
看起来您boost::locale
是使用clang和libc ++(这是Mac OS X上的默认编译器和标准库)编译的,而您的程序是使用g ++和libstdc ++(这是g ++的标准库)编译的。这两个标准库不是二进制兼容的。
您需要使用clang和libc ++编译所有内容,或者获取使用g ++和libstdc ++编译的boost版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句