2012-05-27 46 views
8

Giả sử tôi có ba tệp nguồn C. Hai là LIB đầu tiên (lib * .a?) Và thứ ba là một ứng dụng sử dụng chúng.Các thư viện liên kết tĩnh trong MinGW

Đầu tiên là (re.c):

int re(int i) { 
    return i; 
} 

Thứ hai là (test.c):

int re(int); // Depends on re.c 

int test(int i) { 
    return re(i); 
} 

Và thứ ba là (main.c):

#include<stdio.h> 

int test(int); // Uses test.c 

int main(void) { 

    printf("%d\n",test(0)); 
    return 0; 
} 

Bây giờ làm cách nào tôi có thể tạo hai LIB đầu tiên theo cách cho phép tôi liên kết tĩnh chúng sau này với ứng dụng chính?

tôi biết làm thế nào để tạo ra các file DLL và liên kết chúng tự động trong ứng dụng của tôi như:

cc -o re.dll re.c -shared -Wl, - out-implib = libre.a (for re.c)

cc -o test.dll test.c -L. -lre -shared -Wl, - out-implib = libtest.a (đối với test.c)

cc -o main.exe main.c -L. -lre -ltest


Vậy làm thế nào để tạo ra libs tương đương được liên kết tĩnh trong thực thi nhị phân của tôi trong MinGW, và làm thế nào để liên kết chúng?

Rõ ràng, hệ điều hành Windows :)

Trả lời

11

Tôi tìm thấy giải pháp ở đây: http://www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Libraries

Ý tưởng hạnh phúc là để biên dịch tất cả các thư viện (các tệp nguồn) mà không cần liên kết. Sau đó chuyển đổi các đối tượng đầu ra với ar rcs -o lib*.a *.o trong đó * là tên của các đối tượng được tạo (chuyển đổi từng đối tượng một). Sau đó, chúng tôi chỉ đơn giản biên dịch ứng dụng với -L. để chỉ định thư mục và với -l* để chỉ định tên thư viện mà không có trang trí đặt tên GNU.

Đối với những libs mà phụ thuộc vào người khác, họ nên được chỉ định đầu tiên và sau đó là libs tham chiếu, nếu không lỗi như undefined reference to re sẽ xảy ra khi tôi đã làm -lre -ltest, nơi -ltest -lre là một trong những quyền, bởi vì thư viện kiểm tra đề cập đến lại thư viện .

Dưới đây là cách tôi biên soạn nó:

cc -c -o test.o re.c

cc -c -o re.o re.c

ar RCS - o libtest.a test.o

ar rCS -o libre.a re.o

cc -o main.exe main.c -L.-ltest -lre

Nó cũng hoạt động cho Tiny C Compiler.

1

Bạn đã cố gắng sử dụng các tùy chọn: -mwindows -static

+0

Tôi đã sử dụng -static, nhưng có vẻ như không sử dụng. Tuy nhiên, tôi đã không sử dụng -mwindows. Nó là gì? –

+0

-mwindows chỉ định một ứng dụng gui, -mconsole một ứng dụng giao diện điều khiển trong mingw. Chỉ cần tự hỏi nếu những điều này có bất cứ điều gì giúp đỡ. Nó cũng liên kết các thư viện cửa sổ với ứng dụng nếu đây là những thư mục bị thiếu. Bạn đã thử dependencywalker để xem cái nào bị thiếu? – rotator

0

Thêm vào câu trả lời của Ghasan. (Có thể xây dựng nó tĩnh nếu tất cả các tệp% .a và đối tượng có sẵn)

Hầu hết các thư viện trong mingw đều tĩnh như tôi có thể thấy trong thư mục lib/(tất cả% .a tệp). Trong trường hợp của tôi, các phụ thuộc chia sẻ chỉ là libstd ++ - 6.dll và libgcc_s_dw2-1.dll mà không có trong thư viện tĩnh chút nào.

Tôi không thể chạy tệp thực thi của mình mà không có hai thư viện được chia sẻ đó. Khi mô tả đọc,

Đây là thư viện có thể phân phối lại tự do; nó được yêu cầu bởi, (và bạn phải phân phối nó), bất kỳ ứng dụng nào được biên dịch bởi trình biên dịch ngôn ngữ GNU C++ , trừ khi hỗ trợ cho các thư viện thời gian dùng chung là bị vô hiệu hóa một cách rõ ràng khi xây dựng.

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