這裏是情況,我有一個使用最新GCC(4.3.3)的C++代碼庫,但我需要鏈接到使用GCC 3.2構建的較舊庫。 3。沒有新版本的庫可用,我不能沒有它,它是封閉的源,所以它不能被重建。混合使用C++ ABI以針對傳統庫進行構建
這似乎是一個問題,因爲GCC 4.3.3和3.2.3之間存在ABI不兼容問題,所以我試圖看看我的選項是用來解決這個問題的。
一些額外的細節:
- 我可以重現我的代碼庫與-fabi版本= 1的一切才能得到正確的ABI的版本,但是我依賴於一些較新的功能從的libstdC++版本6
- 代碼庫之外的所有C++庫依賴都是開源的,所以我可以根據需要重建它們,除了這個庫之外。
- 許多C庫依賴關係無法重建或難以重建。
- 老庫似乎是依賴於一些的libstdC++版本5層的功能
到目前爲止我試過:
- 重建所有的C++代碼和依賴庫與-fabi版本= 1和鏈接針對libstdC++版本6.這會導致C++標準庫符號中的一些未定義符號錯誤失敗。
- 與上述相同,但在共享庫中另外鏈接了libstdC++ 5,它解決了鏈接器問題,但似乎導致在遺留庫內運行時混合兩個版本,並導致崩潰。
我看到這個頁面:http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html這似乎表明可以在應用程序中混合使用C++ ABI版本來滿足庫之間不同的依賴關係。但是,在這裏似乎並沒有很好的工作,除非我錯過了一些東西。
任何想法?
如果您將舊的libstdC++靜態鏈接到共享庫,鏈接器選項'-Bsymbolic'和'--exclude-libs'應該會有所幫助。 – 2012-05-03 20:10:55