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

标签 objective-c xcode macos delphi delphi-xe2

我使用 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 。

enter image description here

当我从 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/

相关文章:

xcode 多合一布局 : keyboard shortcut to switch between project and debug page?

java - FFmpeg 使用 Java 运行时在 Mac 上使用目录名称中的空格从 PNG 制作视频

objective-c - 如何检查两个格式字符串是否兼容?

ios - 使用对象对混合数组进行排序

ios - touchesBegan 被 AppDelegate 而不是 UIView 的子类捕获

ios - Segue 在单独的按钮单击时执行

c++ - Xcode - 将二进制文件与调试和发布库链接

ios - "The installed Xamarin.iOS (version 10.3) on the Mac Unnamed Server (...) is not compatible with the local Xamarin.iOS (version 10.4)"

macos - 即使使用 sudo 也无法在/usr/bin 内创建符号链接(symbolic link)

iphone - UISlider 自定义缩略图