46

libtommathライブラリを使用しようとしています。私はUbuntu Linuxで自分のプロジェクトにNetBeans IDEを使用しています。私はライブラリをダウンロードしてビルドしました。作成された.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環境の問題でなければなりませんか?誰でもどのようにこれを修正する考えですか?

答えて

113

ここでのトリックは、コンパイルするモジュールの後にライブラリを置くことです。問題は参考になります。リンカーは参照を順番に解決するので、モジュールがコンパイルされる前に、リンカーは混乱し、ライブラリ内の関数のいずれも必要とは思われません。ライブラリの後にモジュールを置くことによって、モジュール内のライブラリへの参照はリンカによって解決されます。

+7

のように「C」が続いする必要があります+1ああ、ありがとう!私はリンク解決の順序が理にかなっていることを知っていますが、実際にはこれらの事実を思い出すのに役立ちます! – scraimer

+1

これは私のために働いた。私の非常に古いmakefileは動作していましたが、今はコンパイラが自分のためにあまりにもスマートになっているようです:) –

+2

ありがとう、これは素晴らしいお知らせでした! –

35

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

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath 
+1

'libtommath.a'とリンクする正しい方法を書くために+1 – scraimer

+0

うわー、これはかなり難しいです。それを指摘してくれてありがとう。 – lolski

4

.Cソースファイルが(パーセクのようにのように)変換された.cppファイルであれば、その後にexternは

extern "C" void foo(); 
関連する問題