2011-11-08 41 views
5

Các tài liệu GMP nói rằng liên kết tĩnh có thể cung cấp một cải tiến hiệu suất nhỏ.Lỗi khi liên kết tĩnh libgmp trên Linux

Tôi gặp sự cố khi nhận liên kết tĩnh libgmp trên các hệ thống Linux của mình. Tôi đã thu hẹp vấn đề tôi đang gặp phải một trường hợp thử nghiệm nhỏ.

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 

Các nhị phân không tĩnh được biên dịch và liên kết mà không cần bất kỳ vấn đề, nhưng 'Hãy tĩnh' sản xuất:

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 

Thư viện không tồn tại:

ch[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 

Tôi cũng đã thử lgmp cho liên kết tĩnh, nhưng lỗi là như nhau.

Đây là tất cả trên Ubuntu 10.04 và 10.10 AMD64.

Một số người có thể khai sáng cho tôi về lỗi hiển nhiên mà tôi đang thực hiện?

Xin cảm ơn,

Chris.

+1

Bạn đã thử sắp xếp lại sao cho các thư viện cần thiết là * sau * người dùng thư viện trên dòng lệnh? – ephemient

Trả lời

9

Hãy thử

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

từ thư viện nên luôn luôn được liên kết trong trật tự tốt, và sau khi chương trình hoặc đối tượng file sử dụng chúng.

+0

Cảm ơn, đó là thứ tự liên kết. – fadedbee

+0

Điều này xảy ra khá thường xuyên đối với những người mới sử dụng C/C++. Tôi tự hỏi liệu họ có thêm cảnh báo nào đó trong tương lai hay không. Nó chắc chắn sẽ tiết kiệm rất nhiều thời gian. – Jendas

Các vấn đề liên quan