在64位C ++程序中使用32位库

时间:2011-07-24 23:52:39

标签: c++ unix 32bit-64bit

有没有办法在64位系统中使用旧的32位静态库* .a。 没有机会获得这个旧库的源代码再次编译它。 我也不想在gcc中使用-m32,因为该程序使用了许多64位库。 感谢。

4 个答案:

答案 0 :(得分:6)

这完全取决于您运行的平台。例如,PowerPC上的OS X就是“Just Work”。

在x86平台上,您无法将32位库链接到64位可执行文件。如果您确实需要使用该库,则需要启动一个单独的32位进程来处理对库的调用,并使用某种形式的IPC在64位应用程序和辅助进程之间传递这些调用。预先警告:这很麻烦。在开始这条道路之前,请确保真正需要该库。

答案 1 :(得分:1)

在x86 / x86_64平台上,您无法执行此操作。我的意思是,如果您为每个要调用的32位函数编写自定义汇编语言包装器,也许可以。但这是唯一可行的方式。即使你愿意做那项工作,我也不确定它会起作用。

原因是调用约定完全不同。 x864_64平台有更多的寄存器可供使用,64位ABI(应用程序二进制接口,基本上如何传递参数,如何设置堆栈帧等等)所有操作系统的标准都使用这些用于参数传递的额外寄存器等。

这使得32位和64位x86 / x86_64系统的ABI完全不兼容。你必须写一个翻译层。并且32位ABI可能允许32位代码摆弄不允许使用64位代码的CPU内容,这将使您的工作变得更加困难,因为您需要恢复可能修改的内容返回64位代码之前的状态。

这甚至没有谈论这个指针问题。如何将指针传递给位于64位地址的数据结构到32位代码?

答案 2 :(得分:0)

简单回答:你不能。

答案 3 :(得分:0)

您需要使用-m32才能加载32位库。

可能你最好的方法是创建一个包装库的服务器。然后,64位应用程序可以使用IPC(各种方法,例如套接字,fifos),以便与托管库的进程进行通信。

在Windows上,这将被称为进程外COM。我不知道unix上有类似的框架,但同样的方法也可以。

相关问题