0

mylibとloglibの2つの共有ライブラリがあります(名前が変更されています)。どちらにもデストラクタ機能(gccの拡張)があります。mylibのデストラクタ関数には、loglibの関数が必要です。こちらです:

libmy.soのmylib.c:

void __attribute__ ((destructor)) mylib_destructor()
{
    loglib_write_log("destructor");
}

liblog.soからのloglib.c:

void loglib_write_log( const char* txt )
{
   fprintf( log_file, "%s\n", txt );
}

void __attribute__ ((destructor)) loglib_destructor()
{
    if( log_file )
    {
        fclose( log_file );
        log_file = NULL;
    } 
}

ご覧のとおり、のloglib_destructor()前にが呼び出されると問題が発生しmylib_destructor()ます。fprintfはNULLポインタパラメータを取得します。

loglib.cを変更できません。

mylib_destructor他のライブラリのデストラクタの前にそれが呼び出されるようにするにはどうすればよいですか?

mylib_destructormylibのユーザーは、自分のデストラクタにさらに高い優先度を使用したい場合があるため、に最高の優先度を設定したくありません。

4

1 に答える 1

1

gccドキュメントから:

オプションの整数の優先順位を指定して、コンストラクター関数とデストラクター関数が実行される順序を制御できます。優先度の数値が小さいコンストラクターは、優先度の数値が大きいコンストラクターよりも前に実行されます。逆の関係がデストラクタに当てはまります。そのため、リソースを割り当てるコンストラクタと同じリソースの割り当てを解除するデストラクタがある場合、通常、両方の関数の優先度は同じです。コンストラクター関数とデストラクター関数の優先順位は、名前空間スコープの C++ オブジェクトに指定されている優先順位と同じです (C++ 属性を参照)。

これを試しましたか?

の最優先事項である必要はありません。十分な大きさがあればmylib十分です。文書化されていれば、ライブラリのユーザーはそれを信頼できます。

于 2012-07-26T10:14:17.987 に答える