2008-09-23 21 views
10

我期待有兩個版本的BOOST編譯成一個項目在同一時間。理想情況下,他們應該可以沿着這些線路使用:如何在單獨的名稱空間中包裝BOOST?

boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass(); 
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic); 
+0

我很好奇你爲什麼要這樣做。 – Ferruccio 2008-10-24 01:24:36

+0

這是爲了在處理一些不兼容問題時轉換到較新的庫版本。沒有永久的。 – Eclipse 2008-10-26 18:35:23

+0

@Eclipse:如果您不在接口中公開任何Boost類型,則可以使用ELF可見性屬性,隱藏不是公共接口的所有內容。 – wilx 2013-07-19 10:32:57

回答

10

我通過development list discussion閱讀(很好地掃描)。沒有簡單的解決方案。綜上所述:

  1. 包裝頭文件的命名空間聲明

    namespace boost_1_36_0 { 
        #include <boost_1_36_0/boost/regex.hpp> 
    } 
    namespace boost_1_35_0 { 
        #include <boost_1_35_0/boost/shared_ptr.hpp> 
    } 
    
    • 需要修改源文件
    • 不允許兩個版本將包含在同一個翻譯單元,由於宏不尊重命名空間的事實。
  2. 定義升壓包括頭前

    #define boost boost_1_36_0 
        #include <boost_1_36_0/boost/regex.hpp> 
    #undef boost 
    #define boost boost_1_35_0 
        #include <boost_1_35_0/boost/shared_ptr.hpp> 
    #undef boost 
    
    • 源文件可以簡單地用-Dboost=boost_1_36_0
    • 仍然被編譯並沒有解決在一個翻譯單元的宏衝突。
    • 某些內部頭文件內容可能會混亂,因爲這種事情確實發生了。

      #if defined(SOME_CONDITION) 
      # define HEADER <boost/some/header.hpp> 
      #else 
      # define HEADER <boost/some/other/header.hpp> 
      #endif 
      

      但是它可能很容易解決這些情況。

  3. 修改整個升壓庫namespace boost {..}namespace boost_1_36_0 {...},然後提供一個命名空間別名替換。用BOOST_1_36_0_XYZ宏替換所有BOOST_XYZ宏及其用法。
    • 如果您願意付出努力,這可能會奏效。
0

您將有一個麻煩的世界鏈接,因爲名稱會不一樣。是的,我看到你知道這一點,但似乎它會在各地遇到麻煩。

1

@Josh: 雖然我同意發抖,但我仍然認爲這是更好的行動方式。否則,鏈接問題是確定的。在使用objcopy來解決定義衝突的問題之前,我已經遇到了必須破解已編譯庫的情況。由於平臺互操作性的原因,這是一場噩夢,因爲即使在相同編譯器的不同版本(在我的情況下,GCC),名稱修改的工作方式也非常不同。

4

使用bcp可以安裝boost庫的具體位置,並可以取代所有的「空間boost」在他們的代碼中自定義別名。假設我們的別名是'boost_1_36_0',所有的「命名空間提升」代碼塊都將以'boost_1_36_0'開頭。像

bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install 

,但請檢查鏈接中的文檔,因爲我不確定它是否合法syntaxis。

相關問題