我期待有兩個版本的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);
我期待有兩個版本的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);
我通過development list discussion閱讀(很好地掃描)。沒有簡單的解決方案。綜上所述:
包裝頭文件的命名空間聲明
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>
}
定義升壓包括頭前
#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
但是它可能很容易解決這些情況。
namespace boost {..}
與namespace boost_1_36_0 {...}
,然後提供一個命名空間別名替換。用BOOST_1_36_0_XYZ
宏替換所有BOOST_XYZ
宏及其用法。
您將有一個麻煩的世界鏈接,因爲名稱會不一樣。是的,我看到你知道這一點,但似乎它會在各地遇到麻煩。
@Josh: 雖然我同意發抖,但我仍然認爲這是更好的行動方式。否則,鏈接問題是確定的。在使用objcopy
來解決定義衝突的問題之前,我已經遇到了必須破解已編譯庫的情況。由於平臺互操作性的原因,這是一場噩夢,因爲即使在相同編譯器的不同版本(在我的情況下,GCC),名稱修改的工作方式也非常不同。
使用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。
我很好奇你爲什麼要這樣做。 – Ferruccio 2008-10-24 01:24:36
這是爲了在處理一些不兼容問題時轉換到較新的庫版本。沒有永久的。 – Eclipse 2008-10-26 18:35:23
@Eclipse:如果您不在接口中公開任何Boost類型,則可以使用ELF可見性屬性,隱藏不是公共接口的所有內容。 – wilx 2013-07-19 10:32:57