【发布时间】: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++