我有一个项目,我在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
答案 0 :(得分:0)
如果您使用的库是使用与您的代码不同的标准库编译的,则会发生这种情况。可能,它们是用libstdc++
编译的。
要解决此问题,您必须使用libc++
重新编译库,或者查看使用libc++
的二进制库是否可用。
另一个可疑的问题是错误消息中提到的i386
体系结构。您是否有机会编译32位架构? (我不熟悉Mac开发,但我认为它很长时间不支持i386?)
答案 1 :(得分:0)
这不适合你做很多工作。
这就是你所拥有的。
AppGameKit 2
(仅限二进制),显然是针对libstdc ++构建的AppGameKit 2
相关联,因此必须构建AppGameKit 2
几乎肯定是用来构建的)该版本的libstdc ++是pre-c ++ 11,因此它没有任何智能指针(可能保存auto_ptr
,但确实有std::tr1
个东西)
您可以在Mac上安装新版本(例如4.9)gcc,并使用它构建代码(和现代libstdc++
),然后链接到{{1} }。这将可能工作,但该设置中的任何问题都将...难以调试。我不推荐它。
或者,您可以使用AppGameKit 2
,但这也不是一个好的长期解决方案。