80

libtomath ライブラリを使用しようとしています。Ubuntu Linux のプロジェクトに NetBeans IDE を使用しています。ライブラリをダウンロードしてビルドし、「make install」を実行して、結果の .a ファイルを /usr/lib/ に、.h ファイルを /usr/include に配置しました。

ファイルを適切に見つけているようです (/usr ディレクトリにインストールする前にエラーが発生しなくなったため)。

ただし、mp_init (ライブラリにある) を呼び出す単純なメインを作成すると、プロジェクトを作成しようとすると次のエラーが発生します。

mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c
mkdir -p dist/Debug/GNU-Linux-x86
gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o
build/Debug/GNU-Linux-x86/main.o: In function 'main':
/home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1

そのため、リンカーはライブラリ内で関数を見つけることができないようですが、そこにはあるので、何が原因なのかわかりません。

gcc コマンドを直接入力して makefile をスキップすると、同じエラーが発生します。静的ライブラリも gcc でコンパイルされていることも確認しました。

追加するために編集:

コンパイルを直接実行し、ライブラリを -l または -L で追加すると、これらと同じエラーが発生します。

$ gcc -l /usr/lib/libtommath.a main.c 
/usr/bin/ld: cannot find -l/usr/lib/libtommath.a
collect2: ld returned 1 exit status

$ gcc -llibtommath.a main.c 
/usr/bin/ld: cannot find -llibtommath.a
collect2: ld returned 1 exit status

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

私はこのことに非常に慣れていないので、ここで正しいコマンドを使用しているかどうかわかりません. -L の例ではライブラリが見つかりましたか? ライブラリが見つからない場合、どうすればライブラリを見つけることができますか? /usr/lib にあります。現在のディレクトリにある .a ファイルなどで試しました。設定する必要がある環境変数はありますか? もしそうなら、どのように、など。

私は完全に異なるライブラリ(GMP)を試しましたが、まったく同じ問題がありました。これはある種の Ubuntu 環境の問題である必要がありますか? 誰でもこれを修正する方法を知っていますか?

4

3 に答える 3

183

ここでのコツは、コンパイルするモジュールの後にライブラリを配置することです。問題は参考物です。リンカは参照を順番に解決するため、モジュールがコンパイルされる前にライブラリが存在する場合、リンカは混乱し、ライブラリ内の関数が必要であるとは考えません。ライブラリをモジュールの後に配置すると、モジュール内のライブラリへの参照がリンカーによって解決されます。

于 2010-03-21T16:08:18.930 に答える
47

はい、ソースファイル/オブジェクトファイルの後にライブラリを追加する必要があります。このコマンドは問題を解決します:

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath
于 2011-01-14T09:15:44.660 に答える