簡體   English   中英

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

[英]Using 32-bit library in 64-bit C++ program

有沒有辦法在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(應用程序二進制接口,基本上如何傳遞參數,如何設置堆棧幀等等)所有操作系統的標准都使用這些用於參數傳遞的額外寄存器等。

這使得32位和64位x86 / x86_64系統的ABI完全不兼容。 你必須寫一個翻譯層。 並且32位ABI可能允許32位代碼擺弄不允許使用64位代碼的CPU內容,這將使您的工作變得更加困難,因為您需要恢復可能修改的內容在返回64位代碼之前的狀態。

而這甚至沒有談論這個指針問題。 如何將指針傳遞給位於64位地址的數據結構到32位代碼?

簡單回答: 你做不到。

您需要使用-m32才能加載32位庫。

可能你最好的方法是創建一個包裝庫的服務器。 然后,64位應用程序可以使用IPC(各種方法,例如套接字,fifos),以便與托管庫的進程進行通信。

在Windows上,這將被稱為進程外COM。 我不知道unix上有類似的框架,但同樣的方法也行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM