BOOST を別の名前空間にラップするにはどうすればよいですか?
-
02-07-2019 - |
質問
2 つのバージョンの BOOST を同時に 1 つのプロジェクトにコンパイルしたいと考えています。理想的には、次のような方針で使用できるはずです。
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);
解決
私は(よく目を通して)読みました 開発リストのディスカッション. 。簡単な解決策はありません。総括する:
名前空間宣言でのヘッダー ファイルのラップ
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_XYZ
マクロとその使用法BOOST_1_36_0_XYZ
マクロ。- 努力する意欲があれば、これはおそらくうまくいくでしょう。
他のヒント
使用する BCP ブースト ライブラリを特定の場所にインストールしたり、コード内のすべての「名前空間ブースト」をカスタム エイリアスに置き換えたりできます。エイリアスが「boost_1_36_0」であると仮定すると、すべての「namespace boost」コード ブロックは「boost_1_36_0」で始まります。何かのようなもの
bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install
, ただし、それが法的な構文であるかどうかはわからないため、リンク内のドキュメントを自分で確認してください。
@ジョシュ:私も震えには同意しますが、それでもこれがより良い行動であると信じています。そうしないと、リンクでトラブルが発生するのは確実です。以前、コンパイルされたライブラリを次のようにハッキングしなければならない状況がありました。 objcopy
定義の競合を避けるため。同じコンパイラ (私の場合は GCC) のバージョンが異なる場合でも、名前マングリングの動作が大きく異なるため、これはプラットフォームの相互運用性の理由からは悪夢でした。
壊れた名前が異なるため、リンクするのに非常に苦労することになります。そして、はい、あなたはそれを知っていたようですが、それはあらゆるところで問題になりそうです。