如何将使用C++向量的iOS静态库链接到Delphi XE7中?

3

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

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

为了区分此问题与其他可能的问题,我制作了一个简单的项目,使用向量并得到了相同的问题。如果我在那个简单的项目中删除了向量的使用,所有的东西都会很好,在我的iPad上通过Delphi带有iOS目标的FireMonkey项目链接和运行。
我还建立了一个简单的应用程序作为xCode项目,使用相同的C++库。该项目在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类或vector的静态库。您使用的XCode版本是什么,并且能否在日志中包含XCode的编译和链接命令示例? - JVene
你不能使用 TList<T> 或 TArray<T> 重写向量代码吗? - Johan
@JVene:我使用xCode 6.4来构建静态库。如何获取编译和链接命令?我从未使用过命令行工具... - Dominique
@Dominique:首先,我应该在迄今为止的评论中补充一下,扩展我的第一个观点。std::vector是一个内联编写的模板类。这意味着当您实例化特定类型的向量时,将生成操作向量的代码。(即std::vector<int>和std::vector<double>生成两个代码体)。如果您为声明的类型创建向量,例如std::vector<myStruct>,则不会在预构建库中找到它。看起来你缺少的是异常的代码,而不是向量的代码。稍后会有更多关于编译/链接命令的信息(空间有限)。 - JVene
@JVene:我会尝试你所说的组合。我在这里放置了我找到的最后一个文件的xCode命令行(我找不到Build的命令行?)。 - Dominique
显示剩余5条评论
1个回答

0

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

function nothrow: pointer; cdecl; external '/usr/lib/libstdc++.dylib';


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dominique
你不需要使用链接器抱怨的函数,库导出的任何符号都可以。你试过 'nothow' 吗? - Giel
是的,我先尝试了你告诉我的那行代码,但错误仍然存在。 - Dominique

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