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

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

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

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

在x86 / x86_64平台上,你不能这样做。 我的意思是,也许你可以,如果你写每个32位的函数,你想打电话自定义汇编语言包装。 但这是唯一可能的方式。 即使你愿意做这个工作,我也不确定它会起作用。

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

这使得32位和64位x86 / x86_64系统的ABI完全不兼容。 你必须写一个翻译层。 有可能32位ABI允许32位代码摆弄64位代码不被允许摆弄的CPU的东西,这将使你的工作更难,因为你需要恢复可能的修改状态,然后返回到64位代码。

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

简单的回答: 你不能。

你需要使用-m32来加载一个32位的库。

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

在Windows上,这将被称为进程外COM。 我不知道在Unix上有一个类似的框架,但同样的方法将工作。