2016-10-03 21 views
0

私はmath.h.からのログ機能を使用するライブラリを持っていますこのライブラリをコンパイルしてパッケージ化すると、コンパイルエラーは発生しません。これは正常です(私は思う)。私は、アプリケーションでライブラリを使用しようとするとは適切C数学ライブラリと静的ライブラリをリンク

今、gccが私にリンカエラーを与える:

Compiling mytestlist using "mytestlist.o": 
gcc mytestlist.o -I/student/cmpt332/pthreads -I. -std=c99 -Wall -pedantic -L. -L/student/cmpt332/pthreads/lib/linuxx86_64/ -llist -o mytestlist 
./liblist.a(list_adders.o): In function `NodeCreate': 
list_adders.c:(.text+0x343): undefined reference to `log' 
./liblist.a(list_adders.o): In function `ListCreate': 
list_adders.c:(.text+0x62f): undefined reference to `log' 
./liblist.a(list_adders.o): In function `ListFree': 
list_adders.c:(.text+0xdcc): undefined reference to `log' 
list_adders.c:(.text+0xe55): undefined reference to `log' 
list_adders.c:(.text+0xefb): undefined reference to `log' 
./liblist.a(list_adders.o):list_adders.c:(.text+0xf96): more undefined references to `log' follow 
collect2: error: ld returned 1 exit status 
Makefile:47: recipe for target 'mytestlist' failed 
make: *** [mytestlist] Error 1 

なぜこの出来事はありますか?働く唯一の解決策は、しかし、私が行うことは、これは面倒見つけ、私は私が(プログラム自体はのmath.hのない利用しない場合でも)ライブラリを使用するプログラムをコンパイルする際のgccに-lmオプションを供給しなければならないということです。

ライブラリをコンパイルするときにも-lmオプションを指定しようとしましたが、アプリケーションをライブラリを使用してコンパイルすると、同じリンカーエラーが発生します。

ライブラリーを利用する他のプログラムに-lmを提供することなく、math.hでライブラリーをコンパイルする方法はありますか?あなたが迷っている場合は

、私が使用してライブラリーを構成する各オブジェクトのコンパイル:

gcc -std=c99 -Wall -pedantic -static -I. -c list_adders.c -o list_something.o -lm 

を、ライブラリを使用してパッケージ化されている:あなたのgcc -cコマンドで

ar cvfr liblist.a list_something.o ... 
+3

静的ライブラリがリンクされていません。リンクする方法がないため、数学ライブラリとリンクする方法はありません。アプリケーションまたは共有ライブラリはリンクしますが、静的ライブラリはリンクしません。静的ライブラリの依存関係をライブラリ自体に記録したり記録したりする方法もありません。 –

答えて

4

を、 -lmは何もしていません。これはリンカオプションであり、-cは「リンクしない」を意味します。

-lmを置くための適切な場所は、あなたがそれを使用するたび-llist後に実際にあります。これが静的ライブラリの依存関係の仕組みです。 liblistのドキュメントに入れてください。

あなたは凝った何かをしたい場合は、pkg-configがあります。適切なコンフィギュレーションファイルでは、pkg-config --static --libs liblist意志出力-llist -lm

関連する問題