C++链接问题,似乎我无法链接标准的C++库。

20
我正在尝试在iOS应用程序中使用我自己编译的库,这个库是Tesseract OCR库。 编译该库(以及它的依赖项)似乎已经成功了。
但是,当我尝试在我的应用程序项目中链接到这个库时,应用程序无法链接。链接错误让我感到惊讶;似乎Tesseract有问题找到相当标准的C++东西。
请问是否有任何建议可以帮助我解决这个问题?以下是我看到的一些链接错误片段。
Undefined symbols for architecture armv7:
"std::string::find_last_of(char const*, unsigned long) const", referenced from:
  tesseract::WordSizeModel::Init(std::string const&, std::string const&) in    libtesseract.a(word_size_model.o)
"std::string::find_first_of(std::string const&, unsigned long) const", referenced from:
  tesseract::CubeUtils::SplitStringUsing(std::string const&, std::string const&, std::vector<std::string, std::allocator<std::string> >*) in libtesseract.a(cube_utils.o)
"std::string::find_first_not_of(std::string const&, unsigned long) const", referenced from:
  tesseract::CubeUtils::SplitStringUsing(std::string const&, std::string const&, std::vector<std::string, std::allocator<std::string> >*) in libtesseract.a(cube_utils.o)
"std::string::data() const", referenced from:
  tesseract::CubeUtils::SplitStringUsing(std::string const&, std::string const&, std::vector<std::string, std::allocator<std::string> >*) in libtesseract.a(cube_utils.o)
"std::string::find(char, unsigned long) const", referenced from:
  tesseract::TessLangModel::IsLeadingPunc(int) in libtesseract.a(tess_lang_model.o)

1
也许它正在错误的位置查找 libstdc++。您可能需要检查 lddlibtesseract.a 的输出。http://unixhelp.ed.ac.uk/CGI/man-cgi?ldd+1 - Geoff Montee
看起来你的源文件名字是错误的。对于C++,源文件名应该是*.cpp(或者*.M(大写M)用于obj-C++)。基本上你正在使用C编译器进行链接,而你应该使用C++编译器。 - Martin York
不确定你在看哪里。我甚至没有看到任何源代码文件的引用,只有目标文件。 - Geoff Montee
2
洛基感谢。是的,我认为这可能是问题所在,但我已经验证了文件确实以.mm结尾,这是正确的。杰夫。有趣,我会研究一下这个建议。那么,这个错误是否向您表明.a库构建错误。换句话说,这不能在应用程序中修复,它是库本身的问题? - D.C.
2
我通过将一个视图控制器从ViewController.m(单个m)重命名为ViewController.mm(双重m)来解决了问题。说实话,我不确定为什么会奏效。我猜测它在编译过程中以某种方式涉及到C++编译器,并迫使其使用所有正确的路径。 - iutinvg
对我有用 - user678724
5个回答

28

感谢大家的答案。我找到了我的问题,现在在这里分享一下,以防其他人也遇到类似的问题。

我的问题出在项目构建设置上。在“Apple LLVM Compiler 5.0-语言-C++”下有一个“C++标准库”的设置。它的值需要更改为“编译器默认值”。

浪费了几个小时,但问题解决了!


在花费了两个小时寻找这个问题的解决方案后,你的答案终于解决了我的问题。感谢@darren分享它。 - Arslan
我只花了15秒钟在谷歌上搜索这个解决方案,不过还是谢谢你! :) - Vladimir Obrizan
能否修改答案,说明它不是“Xcode设置”,而是项目“构建设置”? - kailoon
保存我的问题。谢谢。 - Bagusflyer
我在我的项目中通过CocoaPods使用了几个库。我必须确保上述设置对Pods项目中的每个目标以及我的主项目都已设置。 - Kyle Redfearn

8

我正在使用较新版本的iOS SDK,并将“构建设置> Apple LLVM 5.0 - 语言 - C++> C++标准库”设置为“编译器默认值”,但却遇到了46个编译错误。

通过将其设置为“libstdc++(GNU C++标准库)”,我消除了这些错误。

希望这能帮助任何在使用“编译器默认值”时遇到困难的人。


适用于我。谢谢。 - Sabbath

1

不确定这是否会对任何人有所帮助,但当我将一个项目与另一个项目链接时,其中一个项目的基础SDK为5.1,而另一个项目的基础SDK为7.0时,我遇到了同样的问题。


0

可能您没有针对armv7架构的SDK,因此您可以编译代码,但是安装在计算机上的标准C++工具是针对另一种架构(例如x86)的,因此您的链接器找不到所需的库以支持该架构。


-1
链接错误表明在路径中找不到C++库。没有更多信息的情况下,我建议检查C++库的路径是否正确。

不,链接错误表明找不到符号。没有错误表明在任何搜索路径中找不到链接库。 - Kaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接