2016-12-29 4 views
2

私はnm1のときに定義された関数fun1()を持つlib1.libを持っています。 私はmy.libからmy.soを作成しました。しかし、私がmy.soを検索すると、fun1()はそこに存在しません。呼び出し元がないかもしれないので、コンパイラは無視しているかもしれません。 だから私はFUN1()が定義されているファイルで.libの関数が定義されていますが、同じ.libから.soが生成されたときに関数が存在しません。

char* dummyArray={ 
&fun1; 
}; 

のようないくつかの仮配列を作成しました。 これも機能しません。 助けてください。

+0

あなたの例では、fun1は、関数へのポインタではなく、[charへのポインタ]です。この識別子は、ライブラリ内の識別子とのコリジョンを持ちません。しかし、コンパイラは 'fun1'が未定義であると不平を言うので、コンパイラの警告をオンにしてください。 –

+0

私はlib1.lib上でnmを実行しますが、シンボリックが定義されているのがわかりますが、なぜシンボルが存在しないのですか? –

+0

'fun1'という_function_(' fun1'という名前の_char_のみを使用します)を使用しないため、リンカーはその関数をライブラリからフェッチしません。 –

答えて

1

ライブラリから関数をフェッチするようにコンパイラとリンカーを強制する必要があります。あなたの現在の試みでは、あなたのプログラムで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はまだロードされていません。

+0

コンパイラに、呼び出されていない関数を無視しないようにするコンパイラオプションはありますか? –

+0

'p 'がグローバル変数または静的変数として宣言された場合、私があなたに与えた解決策は、関数が確実にロードされるようにします。 –

関連する問題