【问题标题】:A huge number of linker errors using LLVM c++11 and libc++使用 LLVM c++11 和 libc++ 的大量链接器错误
【发布时间】:2015-10-17 01:28:39
【问题描述】:

我有一个在 Xcode 中用 C++ 编写的项目。我想使用智能指针,所以我将 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

【问题讨论】:

  • 你需要用相同的语言和标准库配置重新编译AppGameKit。
  • 啊。这不是我的选择。该库是预编译的,因为它是付费的闭源产品。
  • 那你为什么选择使用libc++呢?您可以改用libstdc++。标志:-std=c++11 -stdlib=libstdc++ -arch i386 -arch x86_64
  • 因为如果我使用libstdc++,它会给我一个错误,说智能指针之类的东西不存在。

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


【解决方案1】:

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

要解决这个问题,如果可以的话,你必须重新编译带有libc++的库,或者查看使用libc++的二进制库是否可用。

另一个可疑之处是错误消息中提到的i386 架构。您是否有机会为 32 位架构进行编译? (对Mac开发不熟悉,想了半天不支持i386?)

【讨论】:

  • 我确实将我的程序编译为 32 位程序。这是因为制作库的人拒绝提供 64 位版本,理由是没有必要。
  • 作为一种工作方法,您可以尝试使用包管理器安装较新版本的 GCC(我不是 mac 用户,但我相信您可以使用“自制”)。但是,我不知道它是否可以与 XCode 一起使用。
  • 是的,我会检查那个选项。我可能无法强制 Xcode 使用不同的编译器,但我会试一试。
【解决方案2】:

如果没有您的大量工作,这将无法正常工作。

这就是你所拥有的。

  • AppGameKit 2(仅限二进制),显然是针对 libstdc++ 构建的
  • 你的代码,它链接到AppGameKit 2,所以它必须被构建
  • 一个非常旧的 libstdc++ 版本(来自 gcc 4.2.1) - 这是 Apple 提供的(并且几乎可以肯定是 AppGameKit 2 构建的)

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

您可以在您的 Mac 上安装新版本的 gcc(比如 4.9),并使用它(以及现代的 libstdc++)构建您的代码,然后链接到 AppGameKit 2。这可能会起作用,但是该设置中的任何问题都将......难以调试。不推荐。

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

【讨论】:

    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多