【问题标题】:Can I link against an OSX library file (.a) from Windows?我可以从 Windows 链接到 OSX 库文件 (.a) 吗?
【发布时间】:2014-11-11 11:35:49
【问题描述】:

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

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

【问题讨论】:

  • 否 - 不同的对象/库文件格式,不同的 ABI - 只需为 Windows 重新编译 OS X 源代码。

标签: windows macos linker


【解决方案1】:

在非常罕见的精心制作的情况下,这是可能的。对于有用的现实应用程序:不,它不会工作。

首先,有链接器格式: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,没有办法在一个系统上编译它并在另一个系统上链接/调用它。

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2011-01-07
    相关资源
    最近更新 更多