BOOST の 2 つのバージョンを同時にプロジェクトにコンパイルしたいと考えています。理想的には、次のように使用できる必要があります。
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 の 2 つのバージョンを同時にプロジェクトにコンパイルしたいと考えています。理想的には、次のように使用できる必要があります。
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) の異なるバージョンでも非常に異なる動作をするため、プラットフォームの相互運用性の理由から悪夢でした。
マングルされた名前が異なるため、リンクに苦労することになります。はい、あなたはそれを知っていたようですが、それはあちこちで問題になるようです.