私はLinuxgccの初心者です。Linuxgccのweak属性を学習するための簡単なコードを書いています。
私のサンプルコードを参照してください:
weakref.c、メインファイル。fooメソッドが定義されているかどうかに関係なくファイルが機能するようにしたい。
#include <stdio.h>
extern void foo(void) __attribute__((weak));
int main() {
if (foo){
foo();
printf ("foo is defined\n");
} else {
printf("foo is not defined\n");
}
}
したがって、次のコマンドを実行してコンパイルして実行します。
gcc weakref.c -o main_static
./main_static
そして、出力は「fooが定義されていません」です。これは私が期待したことです。
次に、新しいファイルlibfoo.cを作成しました。以下を参照してください。
#include <stdio.h>
void foo() {
printf("Print in foo.\n");
}
私はメインファイルをlibfoo.cで動作させるために3つの方法を試みました:
- libfoo.cとweakref.cをコンパイルし、オブジェクトファイルをリンクします。
- libfoo.cを静的ライブラリとしてコンパイルし、weakref.cのオブジェクトファイルにリンクします。
- libfoo.cを共有ライブラリとしてコンパイルし、weakref.cのオブジェクトファイルにリンクします。
3番目の方法のみが機能し、次の出力が得られます。
Print in foo.
foo is defined
弱い参照が共有ライブラリでのみ機能するかどうか、およびその理由を教えてください。どうもありがとう!