使用LLVM c ++ 11和libc ++的大量链接器错误

时间:2015-07-27 00:15:25

标签: c++ xcode c++11 llvm-clang libc++

我有一个项目,我在Xcode中用C ++编写。我想使用Smart Pointers,所以我将C ++语言方言改为c ++ 11,将C ++标准库改为libc ++。

现在,当我尝试运行项目时,我收到了大量的链接器错误。

我在我的项目中使用了AppGameKit 2 C ++库,名为libAGKMac.a。我可以看出它是错误的根源,但我不确定原因。

错误的一个示例如下:

Undefined symbols for architecture i386:
"std::string::find(char, unsigned long) const", referenced from:
  zxing::oned::Code39Reader::decodeRow(int, zxing::Ref<zxing::BitArray>) in libAGKMac.a(Code39Reader.o)
"std::string::substr(unsigned long, unsigned long) const", referenced from:
  zxing::oned::MultiFormatUPCEANReader::decodeRow(int, zxing::Ref<zxing::BitArray>) in libAGKMac.a(MultiFormatUPCEANReader.o)
  zxing::oned::UPCAReader::maybeReturnResult(zxing::Ref<zxing::Result>) in libAGKMac.a(UPCAReader.o)
  zxing::oned::UPCEReader::convertUPCEtoUPCA(std::string) in libAGKMac.a(UPCEReader.o)
"std::string::compare(std::string const&) const", referenced from:
  std::map<std::string, zxing::common::CharacterSetECI*, std::less<std::string>, std::allocator<std::pair<std::string const, zxing::common::CharacterSetECI*> > >::operator[](std::string const&) in libAGKMac.a(CharacterSetECI.o)
  std::_Rb_tree<std::string, std::pair<std::string const, zxing::common::CharacterSetECI*>, std::_Select1st<std::pair<std::string const, zxing::common::CharacterSetECI*> >, std::less<std::string>, std::allocator<std::pair<std::string const, zxing::common::CharacterSetECI*> > >::_M_insert_unique(std::_Rb_tree_iterator<std::pair<std::string const, zxing::common::CharacterSetECI*> >, std::pair<std::string const, zxing::common::CharacterSetECI*> const&) in libAGKMac.a(CharacterSetECI.o)
  std::_Rb_tree<std::string, std::pair<std::string const, zxing::common::CharacterSetECI*>, std::_Select1st<std::pair<std::string const, zxing::common::CharacterSetECI*> >, std::less<std::string>, std::allocator<std::pair<std::string const, zxing::common::CharacterSetECI*> > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<std::string const, zxing::common::CharacterSetECI*> const&) in libAGKMac.a(CharacterSetECI.o)
  std::_Rb_tree<std::string, std::pair<std::string const, zxing::common::CharacterSetECI*>, std::_Select1st<std::pair<std::string const, zxing::common::CharacterSetECI*> >, std::less<std::string>, std::allocator<std::pair<std::string const, zxing::common::CharacterSetECI*> > >::_M_insert_unique(std::pair<std::string const, zxing::common::CharacterSetECI*> const&) in libAGKMac.a(CharacterSetECI.o)
  std::_Rb_tree<std::string, std::pair<std::string const, zxing::common::CharacterSetECI*>, std::_Select1st<std::pair<std::string const, zxing::common::CharacterSetECI*> >, std::less<std::string>, std::allocator<std::pair<std::string const, zxing::common::CharacterSetECI*> > >::lower_bound(std::string const&) in libAGKMac.a(CharacterSetECI.o)
  zxing::multi::GenericMultipleBarcodeReader::doDecodeMultiple(zxing::Ref<zxing::BinaryBitmap>, zxing::DecodeHints, std::vector<zxing::Ref<zxing::Result>, std::allocator<zxing::Ref<zxing::Result> > >&, int, int) in libAGKMac.a(GenericMultipleBarcodeReader.o)
"std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const", referenced from:
  zxing::BitMatrix::description() in libAGKMac.a(BitMatrix.o)
  zxing::common::CharacterSetECI::getCharacterSetECIByValue(int) in libAGKMac.a(CharacterSetECI.o)
  zxing::common::ECI::getECIByValue(int) in libAGKMac.a(ECI.o)
  zxing::GridSampler::checkAndNudgePoints(zxing::Ref<zxing::BitMatrix>, std::vector<float, std::allocator<float> >&) in libAGKMac.a(GridSampler.o)
  zxing::GF256Poly::description() const in libAGKMac.a(GF256Poly.o)
  zxing::LuminanceSource::operator std::string() in libAGKMac.a(LuminanceSource.o)
  zxing::oned::Code128Reader::decodeRow(int, zxing::Ref<zxing::BitArray>) in libAGKMac.a(Code128Reader.o)
  ...

错误日志的完整输出可在此处找到:https://gist.github.com/JamEngulfer/afadadb2bd23121b6bba

2 个答案:

答案 0 :(得分:0)

如果您使用的库是使用与您的代码不同的标准库编译的,则会发生这种情况。可能,它们是用libstdc++编译的。

要解决此问题,您必须使用libc++重新编译库,或者查看使用libc++的二进制库是否可用。

另一个可疑的问题是错误消息中提到的i386体系结构。您是否有机会编译32位架构? (我不熟悉Mac开发,但我认为它很长时间不支持i386?)

答案 1 :(得分:0)

这不适合你做很多工作。

这就是你所拥有的。

  • AppGameKit 2(仅限二进制),显然是针对libstdc ++构建的
  • 您的代码与AppGameKit 2相关联,因此必须构建
  • 一个非常古老的libstdc ++版本(来自gcc 4.2.1) - 这就是Apple发布的东西(而AppGameKit 2几乎肯定是用来构建的)

该版本的libstdc ++是pre-c ++ 11,因此它没有任何智能指针(可能保存auto_ptr,但确实有std::tr1个东西)

可以在Mac上安装新版本(例如4.9)gcc,并使用它构建代码(和现代libstdc++),然后链接到{{1} }。这将可能工作,但该设置中的任何问题都将...难以调试。我不推荐它。

或者,您可以使用AppGameKit 2,但这也不是一个好的长期解决方案。