我可以从Windows链接到OSX库文件(.a)吗?

时间:2014-11-11 11:35:50

标签: windows macos linker

假设我有一个在XCode中构建的.a库文件(比如i386)。为了便于讨论,我们假设它不包含操作系统调用(显然会失败)。有没有什么方法可以在Windows环境中链接它?

更具体地说,假设在Foo中定义了静态bar.a方法。我能以某种方式从我的代码中调用它(例如,C ++或C#)吗?

1 个答案:

答案 0 :(得分:2)

在非常罕见的精心制作的案例中,这是可能的。对于有用的现实生活应用:不,它不会起作用。

首先,有链接器格式:OS X使用Mach-O链接器格式,而Windows使用Portable Executable格式(修改后的COFF)。 可能有一种方法可以使用GNU的objcopybinutils的一部分)将一个转换为另一个(它至少允许将部分从一种链接器格式复制到另一种链接器格式)。

除系统调用外,主要障碍是Windows和OS X使用不同的function call conventions(请参阅 x86调用约定列表部分)。

对于x86-64,它们是不兼容的:对于正常的"它是不可能的。 Windows函数调用"正常" OS X的功能是因为它们期望不同寄存器中的参数。使用手工制作的汇编程序和一些技巧,人们可能会产生一个通用的"但是,功能。

使用x86-32,由于参数在两个系统的堆栈上传递,因此成功的可能性更高。返回非32位数字的值将很困难。

因此,人们可以成功编写可在两个操作系统中链接和调用的概念验证函数(在转换链接器格式之后)。使用通用编译器,您可能会在x86-32上的某些罕见情况下成功。但是由于通用编译器生成的x86-64没有办法将它编译成一个系统并在另一个系统上链接/调用它。