ライブラリから関数をフェッチするようにコンパイラとリンカーを強制する必要があります。あなたの現在の試みでは、あなたのプログラムでfun1
と呼ばれる文字を参照します。 fun1
がcharなので、コンパイラは、fun1
という関数である.oファイルにシンボルを宣言する理由はありません。その結果、関数fun1
はライブラリからフェッチされず、実行可能ファイルに関数fun1
が存在しません。ライブラリから機能fun1
をロードするために、コンパイラとリンカを強制的に
(コンパイラが文句を言う必要がありますので、あなたの例では、宣言されたchar fun1
が存在しないことに注意してください。あなたが???に警告を有効にしました)
、あなたが書くことができます。
char *fun1(void); // prototype;
char *(*p)(void) // p is a pointer to a function with same signature as fun1...
= fun1; // and we initialize it with function 'fun1'
注:コンパイラはあなたがp
を使用しないことを決定しなければならない、それはまだそれに関数ポインタ変数とfun1
の割り当てを削除することができるので、fun1
はまだロードされていません。
あなたの例では、fun1は、関数へのポインタではなく、[charへのポインタ]です。この識別子は、ライブラリ内の識別子とのコリジョンを持ちません。しかし、コンパイラは 'fun1'が未定義であると不平を言うので、コンパイラの警告をオンにしてください。 –
私はlib1.lib上でnmを実行しますが、シンボリックが定義されているのがわかりますが、なぜシンボルが存在しないのですか? –
'fun1'という_function_(' fun1'という名前の_char_のみを使用します)を使用しないため、リンカーはその関数をライブラリからフェッチしません。 –