2

変更したい動作を持つ合成例が少しありますが、その方法がよくわかりません。

私が持っているのはこれです:

  1. いくつかの変数の外部宣言を持つ一般的なヘッダーstatich.h :

    #include <iostream>
    struct S {
      S() : x(42) { 
        std::cout << "S(), this=" << this << std::endl;
      }
      ~S() { 
        std::cout << "~S(), this=" << this << std::endl;
      }
      int x;
    };
    
    extern S nakedS;
    
  2. ソースファイルstatich.cppからコンパイルされた静的ライブラリlibstatic.aには、その外部変数の定義があります。

    #include "statich.h"
    
    S nakedS;
    
  3. ソースファイルdyn.cppからコンパイルされ、 libstatic.aとリンクされている動的ライブラリlibdyn.so。ソースコードは次のとおりです。

    #include "statich.h"
    
    void foo() {
      std::cout << "I'm foo() from dyn! nakedS.x == " << nakedS.x << std::endl;
    }
    
  4. ソース ファイルmain.cppからコンパイルされ、静的ライブラリと共有ライブラリの両方にリンクされている実行可能なスーパーテスト。ソースコードは次のとおりです。

    #include "statich.h"
    int main() {
      std::cout << "nakedS.x == " << nakedS.x << std::endl;
    }
    
  5. 私はすべてのものを構築するCMakeLists.txtファイルを持っています。ここにあります:

    cmake_minimum_required(VERSION 2.8.12)
    set(CMAKE_CXX_FLAGS
      "${CMAKE_CXX_FLAGS} -fPIC"    
    )
    
    add_library( static STATIC "statich.cpp" )
    
    add_library( dyn SHARED "dyn.cpp" )
    target_link_libraries( dyn static )
    
    add_executable( supertest main.cpp )
    
    set(DEPS
      static
      dyn
    )
    
    target_link_libraries( supertest ${DEPS} )
    

ポイントは、実行するcmake . && make && ./supertestと次の出力が得られたことです。

S(), this=0x6012c4
S(), this=0x6012c4
nakedS.x == 42
~S(), this=0x6012c4
~S(), this=0x6012c4

これは、同じオブジェクトの二重初期化を意味します。これは、私が望んでいることではありません。libdyn.soを静的アナログに置き換えずに、 この動作を変更できますか? たぶん、いくつかのコンパイラ/リンカーフラグ?それについてもっと学ぶために何を読むべきですか?どんな助けでも大歓迎です。

また、特定のコンパイラ バージョンでこの動作が発生しました: gcc バージョン 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)

別のコンパイラを使用している他のマシン: gcc バージョン 4.6.4 (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04) すべて正常に動作します。

前もって感謝します!

4

1 に答える 1