2012-03-31 28 views
21

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?

Trả lời

25

Cảm ơn bạn đã trả lời! Hóa ra vấn đề là do thứ tự liên kết. Rõ ràng, nếu bạn sử dụng một thư viện mà lần lượt có phụ thuộc thư viện khác, những phụ thuộc khác phải được liệt kê sau thư viện, không phải trước đây như tôi đã từng làm. Đã học được điều gì đó mới mẻ!

5

Bạn có quan tâm để chỉ ra cho GCC đường dẫn thư viện của bạn (sử dụng -L) không? Bằng cách sử dụng -l chỉ duy nhất, GCC sẽ chỉ có thể liên kết các thư viện có sẵn trong các thư mục chuẩn.

-L[path] -l[lib] 
+0

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

1

Lý do là lịch sử. Công cụ "ar" là công cụ lưu trữ tệp gốc trên PDP11 unix, mặc dù sau đó nó được thay thế hoàn toàn bằng "tar" cho mục đích đó. Nó lưu trữ các tệp (các tệp đối tượng, trong trường hợp này) trong một gói. Và có một phần mở rộng riêng biệt có chứa bảng biểu tượng cho trình liên kết để sử dụng. Có thể nếu bạn đang quản lý thủ công các tệp trong kho lưu trữ mà bảng biểu tượng có thể bị lỗi thời.

Câu trả lời ngắn gọn là bạn có thể sử dụng công cụ "ranlib" trên bất kỳ kho lưu trữ nào để tạo lại bảng biểu tượng. Hãy thử điều đó. Rộng hơn, hãy cố gắng tìm ra nơi các thư viện bị hỏng đến từ và sửa lỗi đó.

+2

Tôi nghĩ rằng OP có nghĩa là liên kết * chống lại * một thư viện, chứ không phải tạo thư viện. – ams

5

Cách chính xác để liên kết thư viện tĩnh là sử dụng -l, nhưng điều đó chỉ hoạt động nếu thư viện có thể được tìm thấy trên đường dẫn tìm kiếm. Nếu không, bạn có thể thêm thư mục vào danh sách bằng cách sử dụng -L hoặc đặt tên tệp theo tên, như bạn nói.

Điều này cũng đúng đối với thư viện được chia sẻ, trên thực tế, mặc dù chúng có nhiều khả năng được tìm thấy, có lẽ.

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