9

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);
4

4 に答える 4

10

私は開発リストの議論を(よくスキャンして)読みました。簡単な解決策はありません。総括する:

  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_XYZすべてのマクロとその使用法をマクロに置き換えBOOST_1_36_0_XYZます。
    • あなたが努力を惜しまないなら、これはおそらくうまくいくでしょう。
于 2008-09-23T19:29:00.673 に答える
4

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

、しかし、それが合法的な構文であるかどうかわからないので、リンクのドキュメントを自分で確認してください。

于 2014-01-28T18:01:37.807 に答える
1

@ジョシュ:私は震えに同意しますが、これがより良い行動方針であると信じています. そうしないと、リンクの問題が確実に発生します。objcopy定義の競合を避けるために、コンパイル済みのライブラリをハックしなければならない状況が以前にありました。名前マングリングは、同じコンパイラ (私の場合は GCC) の異なるバージョンでも非常に異なる動作をするため、プラットフォームの相互運用性の理由から悪夢でした。

于 2008-09-23T18:29:52.140 に答える
0

マングルされた名前が異なるため、リンクに苦労することになります。はい、あなたはそれを知っていたようですが、それはあちこちで問題になるようです.

于 2008-09-23T18:25:08.563 に答える