【问题标题】:How to link an iOS static library that uses C++ vectors, for use in Delphi XE7?如何链接使用 C++ 向量的 iOS 静态库以在 Delphi XE7 中使用?
【发布时间】:2015-12-16 17:08:48
【问题描述】:

我在 xCode 中构建了一个静态库,我必须在适用于 iOS 平台的 Delphi XE7 中使用它。该库是用 C++ 编写的并使用向量。我需要在Delphi中使用的函数都是纯C函数(导出“C”)。它们被链接器识别,但有一个我无法摆脱的链接错误:

"  Undefined symbols for architecture armv7:    __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv", referenced from:..."

为了将此问题与其他可能的问题区分开来,我做了一个简单的项目,它使用向量并遇到了同样的问题。如果我在那个简单的项目中删除向量的使用,一切都会顺利,通过 Delphi 中的 FireMonkey 项目与 iOS 目标在我的 iPad 上链接和运行。

我还使用相同的 C++ 库构建了一个简单的应用程序作为 xCode 项目。该项目链接并在 xCode 中运行,而无需对其进行任何特殊处理(我猜 xCode 会自动将应用程序链接到正确的 C++ 库)。

我尝试将 libc++.dylib 和/或 libstdc++.dylib 添加到 xCode 项目中,但是警告说这些是动态库,因此在链接静态库时会忽略它们。我试图找到这些库的静态版本,但在任何地方都找不到它们(它们存在吗?)。

所以我的问题是:如何将 C++ 库添加到我使用 xCode 构建的静态库中,以便 XE7 不会抱怨这个?

已编辑:我得到了最后一个编译文件的以下 xCode 命令行(我没有看到任何带有构建步骤的命令行):

"CompileC /Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/Objects-normal/arm64/Kiss_Wrapper.o Sources/Kiss_Wrapper.cpp normal arm64 c++ com.apple.compilers.llvm.clang.1_0.compiler
cd /Users/admin/Documents/iOSTartini/TartiniLib
export LANG=en_US.US-ASCII
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -arch arm64 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -std=gnu++11 -stdlib=libc++ -fmodules -fmodules-cache-path=/Users/admin/Library/Developer/Xcode/DerivedData/ModuleCache -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -fbuild-session-file=/Users/admin/Library/Developer/Xcode/DerivedData/ModuleCache/Session.modulevalidation -fmodules-validate-once-per-build-session -Wnon-modular-include-in-framework-module -Werror=non-modular-include-in-framework-module -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Werror=return-type -Wunreachable-code -Werror=deprecated-objc-isa-usage -Werror=objc-root-class -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion -Wshorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -DUSE_KISS=1 -DDEBUG=1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk -fstrict-aliasing -Wdeprecated-declarations -Winvalid-offsetof -g -Wno-sign-conversion -miphoneos-version-min=7.0 -iquote /Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/TartiniLib-generated-files.hmap -I/Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/TartiniLib-own-target-headers.hmap -I/Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/TartiniLib-all-target-headers.hmap -iquote /Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/TartiniLib-project-headers.hmap -I/Users/admin/Documents/xCode\ Derived\ Data/Debug-iphoneos/include -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -I/Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/DerivedSources/arm64 -I/Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/DerivedSources -F/Users/admin/Documents/xCode\ Derived\ Data/Debug-iphoneos -MMD -MT dependencies -MF /Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/Objects-normal/arm64/Kiss_Wrapper.d --serialize-diagnostics /Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/Objects-normal/arm64/Kiss_Wrapper.dia -c /Users/admin/Documents/iOSTartini/TartiniLib/Sources/Kiss_Wrapper.cpp -o /Users/admin/Documents/xCode\ Derived\ Data/TartiniLib.build/Debug-iphoneos/TartiniLib.build/Objects-normal/arm64/Kiss_Wrapper.o"

【问题讨论】:

  • 这类事情可能特定于某些版本的编译器、stl 源代码、构建设置等。大部分 STL 只是标头,这意味着可能没有实现 length_error 类的静态库或向量,具体取决于您的实现。您使用的是什么版本的 XCode,您能否在日志中包含 XCode 的编译和链接命令的示例
  • 你不能用 TList 或 TArray 重写向量代码吗?
  • @Johan:有问题的库是用 xCode C++ 编译的,并在内部使用向量,而不是暴露在 Delphi 将访问的公共 API 中。作为静态库,任何依赖库,如 STL 实现等,也必须链接。更改为 TListTArray 不是一个选项,因为它们是 Embarcadero RTL 类,但该库未在 Delphi 或 C++Builder 中编译。
  • @JVene:我使用 xCode 6.4 构建静态库。如何获得编译和链接命令?我从来没有使用过命令行工具...
  • @Dominique:首先,我应该添加到目前为止的 cmets,扩展我的第一点。 std::vector 是一个模板类,内联编写。这意味着当您实例化特定类型的向量时,会生成操作向量的代码。 (即 std::vector 和 std::vector 生成两个代码体)。这不会在预构建的库中,特别是如果您为您声明的类型创建一个向量,例如 std::vector。看起来您缺少的是异常的代码,而不是向量。稍后会详细介绍编译/链接命令(此处空间有限)

标签: c++ ios xcode delphi


【解决方案1】:

您需要在 Delphi 代码中使用 lib 中的符号,以便链接器了解该 lib。您可以将其添加到 Delphi 单元之一,例如:

函数nothrow:指针; cdecl;外部'/usr/lib/libstdc++.dylib';

【讨论】:

  • 感谢您的建议。我不确定如何确定要输入的正确名称:我在链接错误中尝试了确切名称:“函数 _ZNSt3__16vectorIfNS_9allocatorIfEEE21__push_back_slow_pathIRKfEEvOT:指针;cdecl;外部'/usr/lib/libstdc++.dylib' ;"在实现部分以及“函数_ZNSt3__16vectorIfNS_9allocatorIfEEE21__push_back_slow_pathIRKfEEvOT:指针;cdecl;”在界面部分。但是,错误保持不变。我尝试了其中一些符号。我可以使用 HexEdit 在我的 library.a 中的 xCode 中通过文本搜索找到每个实例的几个实例
  • 您不需要使用链接器抱怨的函数,库导出的任何符号都可以。你试过'nothow'吗?
  • 是的,我先试了你告诉我的那行代码,但错误仍然存​​在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多