' ld:找不到建筑的符号???'即使它在那里

时间:2014-07-26 01:34:15

标签: c++ macos boost linker g++

我在尝试在C ++中添加对boost模块的引用时遇到了这个奇怪的问题。首先,你需要知道我正在玩一些C ++,所以也许这是一个我很想念的超级新手。

这是我的环境,因此您可以获得更多上下文:Mac OS Mavericks,MacPorts端口为boost 1.55和g ++ - mp-4.8。我目前正在关联并使用boost_system-mtboost_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)

所以,我现在几乎无能为力。

你能帮助我找出问题所在,或者至少我还能尝试什么?

提前致谢。

1 个答案:

答案 0 :(得分:2)

看起来你的boost::locale是用clang和libc ++编译的,它是Mac OS X上的默认编译器和标准库,而你的程序是用g ++和libstdc ++编译的,这是g ++的标准库。这两个标准库不是二进制兼容的。

您需要使用clang和libc ++编译所有内容,或者获取使用g ++和libstdc ++编译的boost版本。