Tôi muốn bắt đầu bằng cách sử dụng liên kết đơn giản để giải thích vấn đề của tôi. Giả sử rằng có một thư viện z
có thể được biên dịch thành thư viện libz.dll (D: /libs/z/shared/libz.dll) hoặc vào thư viện tĩnh libz.a (D:/libs/z/static/libz .a).Liên kết tĩnh và động/chia sẻ với MinGW
Lết Tôi muốn liên kết chống lại nó, sau đó tôi làm điều này:
gcc -o main.exe main.o -LD:/libs/z/static -lz
Theo this documentation, gcc sẽ tìm kiếm libz.a, đó là
tập tin lưu trữ mà các thành viên là đối tượng tệp
Tôi cũng có thể làm như sau:
gcc -o main.exe main.o -LD:/libs/z/shared -lz
Nó không được đề cập trong tài liệu ở trên mà -l
cờ sẽ tìm kiếm lib<name>.so
.
Điều gì sẽ xảy ra nếu tôi libz.a và libz.dll nằm trong cùng một thư mục? Thư viện sẽ được liên kết với một chương trình như thế nào? Tại sao tôi cần các cờ -Wl,-Bstatic
và -Wl,-Bdynamic
nếu -l
tìm kiếm cả thư viện được chia sẻ và tĩnh?
Tại sao một số nhà phát triển cung cấp tệp .a có tệp .dll cho cùng một mô-đun, nếu tôi biên soạn một bản phân phối thư viện được chia sẻ?
Ví dụ: Qt cung cấp tệp .dll trong thư mục bin có tệp .a trong thư mục lib. Nó có phải là cùng một thư viện, nhưng được xây dựng giống như chia sẻ và tĩnh, tương ứng? Hoặc các tệp .a là một số loại thư viện giả cung cấp liên kết với các thư viện được chia sẻ, nơi có các cài đặt thư viện thực?
Ví dụ khác là thư viện OpenGL trên Windows. Tại sao mọi trình biên dịch phải cung cấp lib OpenGL tĩnh như libopengl32.a trong MingW?
Các tệp có phần mở rộng .dll.a và .la được sử dụng để làm gì?
P.S. Có rất nhiều câu hỏi ở đây, nhưng tôi nghĩ mỗi người phụ thuộc vào câu hỏi trước và không cần chia chúng thành nhiều câu hỏi.
Hãy lấy ví dụ Cygwin: đó là sự hiểu biết của tôi, rằng các chương trình được biên dịch với Cygwin cần một dll nhất định để chạy. Các dll là ràng buộc với một giấy phép nhất định (một trong những cái miễn phí) và phải có mặt trên hệ thống máy chủ cho chương trình. Nếu bạn là một nhà phát triển quên gửi nó cùng với chương trình, chương trình sẽ không chạy. Một ví dụ khác là phiên bản DLL xung đột (tức là opengl). mọi hệ thống đều có các khả năng khác nhau và do đó các triển khai khác nhau của một số DLL nhất định. Vì vậy, đôi khi các nhà phát triển muốn sử dụng đúng phiên bản thư viện => liên kết tĩnh. – scones