使用Delphi XE2制作的.dylib不能被Xcode应用程序使用

时间:2012-02-13 10:33:11

标签: objective-c xcode macos delphi delphi-xe2

我使用Delphi XE2 Upd为OS X构建了一个32位dylib。它的安装名称使用@rpath。所有出口都以下划线开头,用otool验证。导出在Delphi中使用“cdecl”调用约定。

我无法让这个dylib与运行在OS X 10.7.3上的Xcode 4.3中的32位主机应用程序一起使用。当我从Xcode中运行测试项目时,它会在调用堆栈中调用lib和dyld_start时停止。

enter image description here

当我从Finder(从用户库中的Xcode文件夹)运行此应用程序时,我从dyld获得了Image Not Found错误。

我已经添加了一个复制构建阶段,它将dylib(和它需要的libcgunwind.1.0.dylib)复制到Products目录中。我还将Runpath搜索路径设置为@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项目和libs可以在这里找到:http://dl.dropbox.com/u/17403534/CAS4LibTest.zip

更新:此问题似乎是特定于Lion的!它在使用Xcode 4.2的Snow Leopard 10.6.4中运行良好。 (Lion上的Xcode 4.2导致同样的问题)

当FireMonkey应用程序使用时,同样的dylib在Lion下也能正常工作(这些方法是使用external '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的声明更改为适当的类,如初始化部分。

1 个答案:

答案 0 :(得分:2)

您正在构建的库具有对bplrtl160.dylib的隐式依赖关系,您需要将其与应用程序捆绑在一起 - 您应该确保使用运行时包构建库。

当您使用Delphi XE2构建可执行文件时,会发生某种形式的初始化魔法,当您在xcode下构建应用程序时,这种情况不会发生,这会导致问题;可能是一些链接到应用程序的初始化代码,当它作为库时没有链接。

您获得的实际例外是:

@$xp$30System@Sysutils@IReadWriteSync

发生在bplrtl160.dylib 加载时间(即此时您甚至无法与库进行交互)。这是一个接口类,应该在应用程序加载时初始化。

如果从库文件的uses子句中删除System.SysUtils, System.Classes条目,那么它实际上将加载库;但这意味着您从XE2构建的任何库都不能使用类和sysutils代码;这使它有点不适合使用。

关于修复;我不知道。可能根本没有修复。