2011-11-08 18 views
5

Dokumenty GMP mówią, że łączenie statyczne może zapewnić niewielką poprawę wydajności.Błąd podczas statycznego łączenia libgmp w systemie Linux

Mam problem z pobieraniem statycznego linku do libgmp na moich systemach Linux. Zawęziłem problem związany z małą próbą testową.

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 

Non-static binarny jest kompilowany i połączone bez żadnych problemów, ale 'Make statyczne' produkuje:

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 

Biblioteka istnieje:

[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 

Próbowałem również -lgmp dla statycznego linkowania, ale błąd jest taki sam.

To wszystko na Ubuntu 10.04 i 10.10 AMD64.

Czy ktoś może mnie oświecić na temat oczywistego błędu, który popełniam?

Dzięki,

Chris.

+1

Czy próbowałeś zmienić kolejność tak, aby biblioteki były potrzebne * po * użytkownikach biblioteki w linii poleceń? – ephemient

Odpowiedz

9

Spróbuj

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

od biblioteki powinny być zawsze połączone w dobrym stanie, a po zakończeniu programu lub obiektu pliki korzystania z nich.

+0

Dzięki, to była kolejność łączenia. – fadedbee

+0

To zdarza się dość często osobom, które nie znają C/C++. Zastanawiam się, czy dodadzą jakieś ostrzeżenie w przyszłości. Z pewnością zaoszczędziłoby to dużo czasu. – Jendas

Powiązane problemy