2011-11-08 9 views
5

GMPのドキュメントでは、静的リンクを使用するとパフォーマンスが少し改善される可能性があります。Linuxでlibgmpを静的にリンクするときのエラー

Linuxシステムでlibgmpを静的にリンクさせるのに問題があります。私は小さなテストケースが必要な問題を絞り込んだ。

gmptest.c

#include <gmp.h> 

int main(int argc, char** argv) { 
    mpz_t foo; 
    mpz_init(foo); 
    return 0; 
} 

のMakefile:

all: clean gmptest static 

clean: 
    rm -f *.s 
    rm -f *.o 
    rm -f gmptest 
    rm -f static-gmptest 

gmptest: Makefile gmptest.c 
    gcc -std=c99 -O3 -lgmp gmptest.c -o gmptest 

static: clean Makefile gmptest.c 
    gcc -std=c99 -O3 -static /usr/lib/libgmp.a gmptest.c -o static-gmptest 

非静的バイナリをコンパイルおよびリンク何の問題もなく、しかし '静的ください' が生成されます。

gcc -std=c99 -O3 -static /usr/lib/libgmp.a gmptest.c -o static-gmptest 
/tmp/ccWSFke9.o: In function `main': 
gmptest.c:(.text+0x8): undefined reference to `__gmpz_init' 
collect2: ld returned 1 exit status 
make: *** [static] Error 1 

ライブラリは存在します:

[email protected]:~/Dropbox/static$ ls -lA /usr/lib/libgmp.a 
-rw-r--r-- 1 root root 1041666 2010-02-26 13:20 /usr/lib/libgmp.a 

静的なリンクでも-lgmpを試しましたが、エラーは同じです。

これは、すべてUbuntu 10.04および10.10 AMD64上にあります。

私が作っている明らかなエラーについては、いくつか教えていただけますか?

おかげで、

クリス。

+1

コマンドラインでライブラリが* users * of libraryになるように並べ替えを試みましたか? – ephemient

答えて

9

ライブラリは常に良い順に、それらを使用してプログラムまたはオブジェクト・ファイルの後にリンクされなければならないので、

gcc -std=c99 -O3 -static gmptest.c -lgmp -o static-gmptest 

を試してみてください。

+0

ありがとう、それはリンクの順序だった。 – fadedbee

+0

これは、C/C++を初めて使う人にとっては非常に頻繁に起こります。私は彼らが将来何らかの警告を加えるかどうか疑問に思います。それは確かに多くの時間を節約するでしょう。 – Jendas