2011-11-08 43 views
5

Los documentos GMP dicen que la vinculación estática puede proporcionar una pequeña mejora en el rendimiento.Error al vincular estáticamente libgmp en Linux

Tengo un problema al conectar estáticamente libgmp en mis sistemas Linux. He reducido el problema que tengo a un pequeño caso de prueba.

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 

El binario no estático se compila y se enlaza sin ningún problema, pero 'Hacer estática' produce:

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 

La biblioteca existe:

[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 

También he intentado -lgmp para la vinculación estática, pero el error es el mismo.

Todo esto en Ubuntu 10.04 y 10.10 AMD64.

¿Puede alguien aclararme el error obvio que estoy cometiendo?

Gracias,

Chris.

+1

¿Ha intentado reordenar para que las bibliotecas necesarias sean * después de * users-of-library en la línea de comandos? – ephemient

Respuesta

9

Trate

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

ya que las bibliotecas siempre deben estar vinculados en el buen orden, y después del programa o archivos objeto de usarlos.

+0

Gracias, fue el orden de vinculación. – fadedbee

+0

Esto ocurre con bastante frecuencia a personas nuevas en C/C++. Me pregunto si agregarán algún tipo de advertencia en el futuro. Sin duda ahorraría mucho tiempo. – Jendas

Cuestiones relacionadas