23

我在我的原生 iOS 应用程序(一堆 .a 库)中使用第三方框架。我的应用程序是使用 XCode 5 基础 SDK 7.0 开发的。

当部署目标是 6.1(库和标头搜索路径都很好)时,库可以正常编译和链接。但是,当我将部署目标更改为 7.0 时,出现以下链接器错误:

Undefined symbols for architecture i386:
  "std::string::find_last_of(char const*, unsigned long) const", referenced from:
      GetExecutionDir(ECTemplateString<char>&, char*, bool) in myLibrary.a(moPlatForm.o)
  "std::string::find(char const*, unsigned long) const", referenced from:
      ParseLog(std::string const&, unsigned int&, CmoDateTime&, int&, std::string&) in myLibrary.a(AppLog.o)
  "std::string::size() const", referenced from:
      mo::CmoParam::WriteToStream(void*, mo::STREAM_STATE*) in myLibrary.a(moParams.o)
  "std::string::c_str() const", referenced from:
      GetExecutionDir(ECTemplateString<char>&, char*, bool) in myLibrary.a(moPlatForm.o)
      CMocaFileTransfer::UpdateParamsForGetTraceFiles(mo::CmoParamList&, long) in myLibrary.a(RobieFileTransfer.o)
      CMocaFileTransfer::AddTraceFileForUpload(std::string const&, std::string const&) in myLibrary.a(RobieFileTransfer.o)
      CMocaFileTransfer::CreateParamsForSendTraceFiles(mo::CmoObject&) in myLibrary.a(RobieFileTransfer.o)
      mo::CmoParam::WriteToStream(void*, mo::STREAM_STATE*) in myLibrary.a(moParams.o)
      ParseLog(std::string const&, unsigned int&, CmoDateTime&, int&, std::string&) in myLibrary.a(AppLog.o)
      CAppLog::LogExists(unsigned int) in myLibrary.a(AppLog.o)
      ...

库有点旧,我不确定是否存在兼容性问题。我不打算支持 iOS 6,所以我需要将部署目标设置为 7.0。任何形式的帮助/指导都会很棒。

4

3 回答 3

46

对我来说,在依赖项中包含“ stdc++.6.0.9.dylib ”而不是“ stdc ++.dylib ”也解决了链接器错误

于 2014-04-02T11:05:34.010 回答
28

事实证明,如果 XCode 在项目中找不到任何 C++ 文件,则假定不需要 libstd++。因此,您必须手动将 C++ 文件添加到项目中(一个空的 .mm 文件就足够了)。这就是解决方案。

所有的功劳都归于这个Stackoverflow 线程中的答案

于 2013-10-09T15:29:11.123 回答
8

看起来 myLibrary.a 是通过调用 C++ 代码构建的,并使用 libstdc++ 作为其 C++ 标准库。您的应用程序项目可能改为指定 libc++,可能是编译器默认值。

尝试切换回 libstdc++ 并查看错误是否消失(或至少改变)。您的最终解决方案可能是针对新标准库构建的库。

于 2013-10-09T12:53:24.563 回答