0

pthread_mutex_t に問題があります。静的フィールド pthread_mutex_t を作成しようとすると、静的関数で初期化し、最終的にいくつかのクラス メソッド内で使用すると、次のような多くのエラーが発生します。

main.o: In function `LogWriter::initialize(pthread_mutex_t*)':
 main.cpp:(.text._ZN9LogWriter10initializeEP15pthread_mutex_t[LogWriter::initialize(pthread_mutex_t*)]+0x7): undefined reference to `LogWriter::mutex'

簡略化されたクラス コード:

class LogWriter{
    static pthread_mutex_t mutex;

    static void initialize(pthread_mutex_t *mut){
    LogWriter::mutex = PTHREAD_MUTEX_INITIALIZER;
    //if(pthread_mutex_init(&(LogWriter::mutex), NULL) != 0){
        //init failed
    //}
    }
    public:
    static LogWriter getInstance(string module_name){
    LogWriter  instance(module_name);
    return instance;
    }

    LogWriter& operator<<(string a);
};

私の質問は次のとおりです。なぜですか?通常の (静的ではない) フィールドとして定義すれば、何の問題もないことはわかっています。グーグルも検索しましたが、これにリンクされている資料は見つかりませんでした。また、静的な pthread_mutex へのポインターを作成し、main 関数で初期化すると、このように終了します。

4

1 に答える 1

5

コード内の一部のソースファイルに、以下を追加する必要があります。

static LogWriter::pthread_mutex_t mutex;

コンパイラは変数を特定のソースファイルに「配置」しません。そのためにそれを行う必要があります。宣言はclassコンパイラに「どこかに静的変数があります」と伝えるだけですが、少なくとも理論的には、変数の順序と配置によって違いが生じる可能性があるためです[たとえば、異なるオブジェクトファイルの製品「データ」が異なる場合があります一部の組み込みシステムのメモリのセクション]、コンパイラは好きな場所にそれを投げることはできません-それはあなたがそれを望まない場所である可能性があります。

于 2013-03-10T14:55:11.503 に答える