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

C++ 在64位C+;中使用32位库+;程序,c++,unix,32bit-64bit,C++,Unix,32bit 64bit,有没有办法在64位系统中使用旧的32位静态库*.a。 现在没有机会获得这个旧库的源代码来再次编译它。 我也不想在gcc中使用-m32,因为该程序使用许多64位库。 谢谢。简单回答:你不能。这完全取决于你运行的平台。例如,PowerPC上的OSX,这将“正常工作” 在x86平台上,无法将32位库链接到64位可执行文件。如果确实需要使用该库,则需要启动一个单独的32位进程来处理对该库的调用,并使用某种形式的IPC在64位应用程序和该助手进程之间传递这些调用。事先警告:这是一个很大的麻烦。在开始这条路

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

简单回答:你不能。这完全取决于你运行的平台。例如,PowerPC上的OSX,这将“正常工作”


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

您需要使用
-m32
来加载32位库

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


在Windows上,这将被称为进程外COM。我不知道在unix上是否有类似的框架,但同样的方法也会起作用。

在x86/x86\u 64平台上,您不能这样做。我的意思是,如果你为你想调用的每一个32位函数编写自定义汇编语言包装,也许你可以。但这是唯一可能的办法。即使你愿意做这项工作,我也不确定它是否会起作用

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

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


这甚至都不是关于指针的问题。如何将指向位于64位地址的数据结构的指针传递给32位代码?

您可以随代码一起提供一个小型32位虚拟机,并向该虚拟机发送库调用…@Kerrek:虚拟机不是必需的,只是进程外IPC。64位Windows运行32位代码很好,只要它处于32位用户模式进程中。@Ben Voigt:我觉得它是在模拟器中运行的。我不太熟悉WOW64的细节,所以我不知道在Windows上64位和32位进程之间可以使用什么形式的IPC进行通信。@斯蒂芬:想想WINE(它不是模拟器)。WOW64的机制大致相同,提供了一组32位库,用于调用操作系统特定的系统调用。@斯蒂芬:如果您不知道WOW64的详细信息,则无法判断它是否“完全相同”或者不是。@Ben Voigt:运行32位进程的64位操作系统与在同一地址空间中相互调用的32位和64位代码完全不同。从技术上来说,这是一个答案,但稍微细化一下就好了。