2011-01-28 49 views
7

我有一個應用程序需要使用某個封閉源代碼的C++ API。這個API分發了一些Boost,二進制庫文件和全部。我喜歡在自己的代碼中使用Boost。我不能只使用他們的Boost版本,因爲他們沒有分發我需要的Boost的所有部分。我應該如何繼續?目標平臺是Linux,最終是Windows。boost通過封閉源代碼庫發佈

  • 我不會通過API邊界傳遞Boost對象。
  • 使代碼使用 boost頭文件,以及API的代碼使用 Boost頭文件我可以編譯事情的目標文件。這部分看起來很直接。
  • 得到:如何鏈接代碼 Boost庫文件和API的代碼來 Boost庫文件。我是否需要編譯我自己的API封裝器 - 一個封裝器,它的頭文件是而不是包括Boost - 到一個動態庫? (這是我可以考慮做鏈接的唯一方法,API的Boost庫文件中的符號應該與我的Boost庫文件中的符號相同,我在做兩個階段的鏈接,沒有?只是沒了其餘的我可以鏈接一件程序的方式是通過使動態庫,不是嗎?)
+1

我還必須使用第三方的閉源庫。他們將自己的(非常舊的)Boost版本與庫分發。幸運的是,他們重命名了他們的Boost庫,比如`BoostSystem_x86-64_redhat_gcc41_mdi`而不是`boost_system`。不知何故,我的代碼實際上構建。 – chrisaycock 2011-01-28 04:45:36

+1

請參閱http://stackoverflow.com/questions/2907882/using-concurrently-2-versions-of-boost – KitsuneYMG 2011-01-28 05:22:13

回答

0

如果你只使用僅標頭Boost庫,您可以單獨從剛剛生成代碼與其他庫鏈接的代碼。

您使用哪種boost庫?

1

給定的可執行文件每個符號只能有一段代碼。因此,如果他們的圖書館使用boost v。1中的符號foo,並使用boost v。2中的相同符號,那麼您將遇到衝突。沒有簡單的方法來擺脫這種衝突而不改變符號。如果你能夠將升壓代碼編譯爲dynamic library,那麼應該可以使用動態執行,但這看起來好像過度。

因爲在C++中,一個符號被它的類/名稱空間弄亂了,所以你也可以改變其中的一個來讓符號改變。

0

api如何與使用boost庫的鏈接?他們部署了一個boost - ##。所以,或者它是靜態鏈接?

因此,請在您的api .so中運行「objdump -T api.so | grep boost」以檢查api是否暴露了Boost。

此外,它們可能已經重新命名了boost命名空間,如用戶chrisaycock提到的那樣。使用C++ filt命令仔細看看使用「objdump -T api.so | grep boost」找到的符號。

如果它是靜態鏈接的,並且提升符號沒有暴露(或重命名),那麼您可以在代碼中使用boost而不用考慮API的提升。

如果提升真的暴露出來,我建議嘗試使用提升。對於使用boost的代碼,可能不會發生衝突。如果發生這種情況,您可以編譯一個新的提升並更改您的名稱空間名稱。只需運行一個替換所有腳本替換「命名空間增強」,如「命名空間boost_1_46」。