Tại sao một số thư viện tĩnh (lib * .a) có thể được liên kết theo cùng cách mà các thư viện chia sẻ (lib * .so) được liên kết (ld -l switch), nhưng một số có thể không?Cách thích hợp để liên kết một thư viện tĩnh bằng GCC
Tôi đã luôn luôn được dạy rằng tất cả thư viện, tĩnh hay không, có thể được liên kết với -l ..., tuy nhiên tôi đã chạy vào một thư viện cho đến nay (GLFW), không có gì ngoài việc spew "undefined reference" lỗi liên kết nếu tôi cố liên kết nó theo cách này.
Theo phản hồi trên this question, cách "thích hợp" để liên kết các thư viện tĩnh là bao gồm chúng trực tiếp, cùng với các tệp đối tượng của riêng tôi, thay vì sử dụng -l. Và, trong trường hợp của thư viện GLFW, điều này chắc chắn giải quyết được vấn đề. Nhưng mỗi thư viện tĩnh khác tôi đang sử dụng hoạt động tốt khi liên kết với -l.
Vì vậy:
- gì có thể gây ra một thư viện này để không hoạt động khi liên kết chứ không phải là bao gồm trực tiếp? Nếu tôi biết nguyên nhân, có lẽ tôi có thể chỉnh sửa và biên dịch lại thư viện để khắc phục sự cố.
- Có đúng là bạn không được phép liên kết các thư viện tĩnh giống như cách bạn liên kết các thư viện được chia sẻ? (Và nếu không, tại sao không?)
- Trình liên kết vẫn có thể loại bỏ các chức năng thư viện chưa sử dụng khỏi tệp thực thi đầu ra khi thư viện được bao gồm trực tiếp theo cách này không?
Có, đường dẫn đến mỗi thư viện được cung cấp bằng -L, trước cờ -l tương ứng. GCC có thể tìm thấy thư viện, nhưng cung cấp một số lượng lớn các lỗi tham chiếu không xác định từ bên trong thư viện. – Nairou