Ошибка при статической компоновке libgmp в Linux - PullRequest
5 голосов
/ 09 ноября 2011

В документах GMP говорится, что статическое связывание может обеспечить небольшое улучшение производительности.

У меня проблема с получением статической ссылки на libgmp в моих системах Linux. Я сузил проблему, с которой я столкнулся, до крошечного контрольного примера.

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

Нестатический двоичный файл компилируется и связывается без каких-либо проблем, но «Make static» выдает:

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

Библиотека существует:

chris@vostro:~/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 Ответ

10 голосов
/ 09 ноября 2011

Попробуйте

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

поскольку библиотеки всегда должны быть связаны в хорошем порядке, а после программы или объектных файлов их следует использовать.

...