使用LLVM c+;时出现大量链接器错误+;11和libc++; 我在XCODE中用C++编写了一个项目。我想使用智能指针,所以我把C++语言方言改为C++ 11和C++标准库到LBC+++。p>

使用LLVM c+;时出现大量链接器错误+;11和libc++; 我在XCODE中用C++编写了一个项目。我想使用智能指针,所以我把C++语言方言改为C++ 11和C++标准库到LBC+++。p>,c++,xcode,c++11,llvm-clang,libc++,C++,Xcode,C++11,Llvm Clang,Libc++,现在,当我尝试运行我的项目时,我会遇到大量链接器错误 我在我的项目中使用AppGAMEKIT 2 C++库,名为LabAbkMAC。我可以看出这是错误的根源,但我不知道为什么 错误示例如下: Undefined symbols for architecture i386: "std::string::find(char, unsigned long) const", referenced from: zxing::oned::Code39Reader::decodeRow(int, zxin

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

我在我的项目中使用AppGAMEKIT 2 C++库,名为LabAbkMAC。我可以看出这是错误的根源,但我不知道为什么

错误示例如下:

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)
  ...
架构i386的未定义符号: “std::string::find(char,unsigned long)const”,引用自: libAGKMac.a(Code39Reader.o)中的zxing::oned::Code39Reader::decodeRow(int,zxing::Ref) “std::string::substr(无符号长、无符号长)常量”,引用自: libAGKMac.a(MultiFormatUPCEANReader.o)中的zxing::oned::MultiFormatUPCEANReader::decodeRow(int,zxing::Ref) libAGKMac.a(UPCAReader.o)中的zxing::oned::UPCAReader::mayberturnresult(zxing::Ref) libAGKMac.a(UPCEReader.o)中的zxing::oned::UPCEReader::convertUPCEtoUPCA(std::string) “std::string::compare(std::string const&)const”,引用自: libAGKMac.a(CharacterSetECI.o)中的std::map::operator[](std::string const&) libAGKMac.a(CharacterSetECI.o)中的std::_Rb_tree::_M_insert_unique(std:_Rb_tree_迭代器,std::pair const&) libAGKMac.a(CharacterSetECI.o)中的std::_Rb_tree::_M_insert(std:_Rb_tree_node_base*,std:_Rb_tree_node_base*,std::pair const&) std::_Rb_tree::_M_insert_unique(std::pair const&)在libAGKMac.a(CharacterSetECI.o)中 libAGKMac.a(CharacterSetECI.o)中的std::_Rb_tree::下限(std::string const&) libAGKMac.a(GenericMultipleBarcodeReader.o)中的zxing::multi::GenericMultipleBarcodeReader::dodecodemiple(zxing::Ref,zxing::decodeHits,std::vector&,int,int) “std::basic_stringbuf::str()const”,引用自: libAGKMac.a(BitMatrix.o)中的zxing::BitMatrix::description() zxing::common::CharacterSetECI::libAGKMac.a(CharacterSetECI.o)中的getCharacterSetECIByValue(int) libAGKMac.a(ECI.o)中的zxing::common::ECI::getECIByValue(int) libAGKMac.a(GridSampler.o)中的zxing::GridSampler::checkandnumedgepoints(zxing::Ref,std::vector&) libAGKMac.a(GF256Poly.o)中的zxing::GF256Poly::description()常量 libAGKMac.a(LuminanceSource.o)中的zxing::LuminanceSource::operator std::string() libAGKMac.a(Code128Reader.o)中的zxing::oned::Code128Reader::decodeRow(int,zxing::Ref) ...
错误日志的完整输出可在此处找到:

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

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


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

这将不起作用,因为您没有做很多工作

这是你得到的

  • AppGameKit 2
    (仅二进制),它显然是针对libstdc构建的++
  • 您的代码链接到AppGameKit 2,因此必须构建它
  • libstdc++的一个非常旧的版本(来自GCC4.2.1)——这就是苹果公司提供的(而且几乎可以肯定的是,
    AppGameKit 2
    就是用这个版本构建的)
libstdc++的那个版本是c++11之前的版本,所以它没有任何智能指针(可能保存
auto\u ptr
,但它有
std::tr1
之类的东西)

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


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

您需要使用相同的语言和标准库配置重新编译AppGameKit.Ah。那不是我的选择。这个库是预编译的,因为它是一个付费的封闭源代码产品。那么你为什么选择使用
libc++
?您可以使用
libstdc++
。标志:
-std=c++11-stdlib=libstdc++-arch i386-arch x86_64
,因为如果我使用
libstdc++
,它会给我错误,说像智能指针这样的东西不存在。我确实是将我的程序编译为32位程序。这是因为制作该库的人拒绝提供64位版本,理由是这是不必要的。作为一种解决方法,您可以尝试使用软件包管理器安装更新版本的GCC(我不是mac用户,但我相信您可以使用“自制”)。不过,我不知道它是否能与XCode一起工作。是的,我会检查这个选项。我可能无法强制Xcode使用不同的编译器,但我会尝试一下。