Nếu chữ ký của các hàm liên quan không thay đổi, thì "xây dựng lại" chương trình có nghĩa là các tệp đối tượng phải được liên kết lại. Bạn không cần phải biên dịch lại lại.
API là hợp đồng mô tả giao diện cho các chức năng công khai trong thư viện. Khi trình biên dịch tạo ra mã, nó cần biết loại biến nào để truyền cho từng hàm, và theo thứ tự nào. Nó cũng cần phải biết kiểu trả về, vì vậy nó biết kích thước và định dạng của dữ liệu sẽ được trả về từ hàm đó. Khi mã của bạn được biên dịch, địa chỉ của một hàm thư viện có thể được biểu diễn là "bắt đầu của thư viện, cộng với 140 byte". Trình biên dịch không biết địa chỉ tuyệt đối, vì vậy nó chỉ đơn giản chỉ định một offset từ đầu của thư viện.
Nhưng trong phạm vi thư viện, nội dung (có nghĩa là, việc triển khai) của các chức năng có thể thay đổi. Khi điều đó xảy ra, độ dài của mã có thể thay đổi, do đó địa chỉ của các hàm có thể thay đổi. Đó là công việc của trình liên kết để hiểu nơi các điểm vào của mỗi chức năng cư trú, và điền vào các địa chỉ đó vào mã đối tượng để tạo ra tệp thực thi.
Mặt khác, nếu cấu trúc dữ liệu trong thư viện đã thay đổi và thư viện yêu cầu người gọi để quản lý bộ nhớ (một thực tế xấu, nhưng tiếc là phổ biến), sau đó bạn sẽ cần phải biên dịch lại mã để nó có thể giải thích cho những thay đổi. Ví dụ: nếu mã của bạn sử dụng malloc(sizeof(dataStructure))
để cấp phát bộ nhớ cho cấu trúc dữ liệu thư viện được tăng gấp đôi về kích thước, bạn cần phải biên dịch lại mã của mình vì sizeof(dataStructure)
sẽ có giá trị lớn hơn.
Nguồn
2012-04-22 14:44:19
Rất tương tự như http://stackoverflow.com/a/10269818/841108 –