我使用 Delphi XE2 Upd 为 OS X 构建了一个 32 位 dylib。 3. 安装名称使用@rpath。所有导出均以下划线开头,并使用 otool 进行验证。导出在 Delphi 中使用“cdecl”调用约定。
我无法让此 dylib 与在 OS X 10.7.3 上运行的 Xcode 4.3 中的 32 位主机应用程序一起使用。当我从 Xcode 中运行测试项目时,它会停止调用调用堆栈中的 lib 和 dyld_start 。
当我从 Finder(从用户库中的 Xcode 文件夹)运行此应用程序时,我从 dyld 收到“未找到图像”错误。
我已经添加了一个复制构建阶段,它将 dylib(以及它需要的 libcgunwind.1.0.dylib)复制到 Products 目录中。我还将运行路径搜索路径设置为@executable_path或@loader_path,但都无济于事。
该方法是通过
导入的extern int TestLib(int AInt);
该库尽可能小,仅包含此单元:
unit LibTestExports;
uses
System.Classes,
System.SysUtils;
function _TestLib(AInt: Integer): Integer; export; cdecl;
begin
Result:= AInt + 2;
end;
exports
_TestLib;
end.
我不知道是什么导致了这种情况以及如何让它发挥作用。
Xcode 项目和库可以在这里找到:http://dl.dropbox.com/u/17403534/CAS4LibTest.zip
更新:这个问题似乎是 Lion 特有的!它在使用 Xcode 4.2 的 Snow Leopard 10.6.4 中运行良好。 (Lion 上的 Xcode 4.2 也会导致同样的问题)
当 FireMonkey 应用程序使用相同的 dylib 时,该 dylib 在 Lion 下也可以正常工作(这些方法是使用外部“libName”
静态导入的)。
在 Lion 下运行同一个应用程序,该应用程序在 SnowLeopard 下运行良好,我收到包含以下调用堆栈的崩溃报告:
0 ??? 0x0013317c 0 + 1257852
1 libCAS4.dylib 0x00010b5c @DbgEvalFrame + 1648
2 libCAS4.dylib 0x00010e1a @DbgEvalFrame + 2350
3 dyld 0x8fe55203 ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 251
4 dyld 0x8fe54d68 ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 64
5 dyld 0x8fe522c8 ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 256
6 dyld 0x8fe5225e ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 150
7 dyld 0x8fe53268 ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 62
8 dyld 0x8fe47694 dyld::initializeMainExecutable() + 214
9 dyld 0x8fe4bf99 dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**) + 2238
10 dyld 0x8fe452ef dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*) + 637
11 dyld 0x8fe45063 _dyld_start + 51
解决方法: Embarcadero 支持现在返回了一个解决方法,它为我解决了这个问题:在 System.Classes 的本地副本中,将 GlobalNameSpace: IReadWriteSync 的声明更改为适当的类,如初始化部分。
最佳答案
您正在构建的库对 bplrtl160.dylib
有隐式依赖,您需要将其与应用程序捆绑在一起 - 您应该确保该库是使用运行时包构建的.
当您使用 Delphi XE2 构建可执行文件时,会发生某种形式的初始化魔法,而在 xcode 下构建应用程序时不会发生这种情况,从而导致问题;可能是一些链接到应用程序中的初始化代码,但在将其制作为库时未链接到应用程序中。
您收到的实际异常位于:
@$xp$30System@Sysutils@IReadWriteSync
这发生在bplrtl160.dylib
加载时间(即此时您甚至无法与库进行交互)。这是一个接口(interface)类,应在应用程序加载时初始化。
如果从库文件的uses子句中删除System.SysUtils、System.Classes
条目,那么它实际上会加载该库;但这意味着您从 XE2 构建的任何库都不能使用类和 sysutils 代码;这使得它有点不太适合使用。
至于修复;我不知道。可能根本没有解决办法。
关于objective-c - 用Delphi XE2制作的.dylib不能被Xcode应用程序使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9258973/