0

エラーは次のとおりです。

symbol lookup error: ./src/libprog3.so: undefined symbol: pow

math.h を使用する関数であっても、ライブラリ内の他のすべての関数は正常に動作しますが、pow() を必要とする関数を呼び出すとクラッシュします。共有ライブラリの場合は問題なく動作しました。gcc と makefile を使用してコンパイルしています。私が makefile に加えた唯一の変更は、ライブラリーに -ldl を追加したことです。私はまだそこに -lm を持っています。共有ライブラリの代わりにdllへの変更をサポートするようにドライバープログラムを変更しましたが、エラーの原因となった関数は変更されていません。

変更する必要があるメイクファイルは他にありますか? メイクファイルは次のとおりです。

testlib: src/driver.o src/prog3.o
    gcc -fPIC -Wall -c src/prog3.c -o src/prog3.o
    gcc -Wall -shared -o src/libprog3.so src/prog3.o
    gcc -Wall -o $@ src/driver.c -ldl -lm -Lsrc -lprog3
4

1 に答える 1

3

あなたがしている必要があります:

gcc -Wall -shared -o src/libprog3.so src/prog3.o -lm

つまり、共有ライブラリはその依存関係とともに構築する必要があります。を省略した場合は、未解決のシンボルが、メイン プログラムまたは既に読み込まれているライブラリのシンボルによって解決されることを-lmリンカに伝えます。libprog3.soメイン プログラムのリンク コマンド ラインを設定したようです-lmが、私の推測では、メイン プログラムは実際にはシンボルを使用しlibm.soていないため、メイン プログラムのテーブルに追加されていないためDT_NEEDED、まだロードされていません。 .

いずれにせよ、このように依存関係を明示的にすることは、ほとんどの場合に最適です。

于 2012-04-13T04:24:22.940 に答える