2014-04-20 17 views

Trả lời

11

Thư viện là "tệp lưu trữ" chứa mã đã được biên dịch. Thông thường, bạn muốn sử dụng thư viện được tạo sẵn để sử dụng một số chức năng mà bạn không muốn thực hiện (ví dụ: giải mã JPEG, phân tích cú pháp XML, cung cấp cho bạn các tiện ích GUI, bạn đặt tên cho nó). Thông thường trong C và C++ sử dụng thư viện giống như sau: bạn #include một số tiêu đề của thư viện chứa hàm/lớp khai báo - tức là họ nói với trình biên dịch rằng các ký hiệu bạn cần tồn tại ở đâu đó, mà không thực sự cung cấp mã của họ. Bất cứ khi nào bạn sử dụng chúng, trình biên dịch sẽ đặt trong tệp đối tượng một trình giữ chỗ, cho biết rằng cuộc gọi hàm đó sẽ được giải quyết tại thời gian liên kết, khi phần còn lại của các mô-đun đối tượng sẽ có sẵn.

Sau đó, tại thời điểm liên kết, bạn phải chỉ định thư viện thực sự nơi mã được biên dịch cho các chức năng của thư viện được tìm thấy; sau đó, trình liên kết sẽ liên kết mã được biên dịch này với bạn và tạo ra tệp thực thi cuối cùng (hoặc trong trường hợp thư viện động, nó sẽ thêm thông tin có liên quan cho trình tải để thực hiện liên kết động khi chạy).

Nếu bạn không chỉ định thư viện sẽ được liên kết, thì trình liên kết sẽ có các tham chiếu chưa được giải quyết - tức là nó sẽ thấy một số hàm được khai báo, bạn đã sử dụng chúng trong mã của bạn. tìm; đây là nguyên nhân gây ra "lỗi tham chiếu không xác định" khét tiếng.

Chú ý rằng tất cả các quá trình này là giống hệt với những gì thường xảy ra khi bạn biên dịch một dự án mà được làm bằng nhiều .cpp file: mỗi .cpp được biên soạn một cách độc lập (biết các chức năng quy định tại những người khác chỉ qua nguyên mẫu, thường viết bằng .h các tệp) và cuối cùng mọi thứ được liên kết với nhau để tạo ra tệp thực thi cuối cùng.

+0

Điều này có đúng với tiêu đề chuẩn không? Ví dụ: '' chỉ bao gồm các khai báo chứ không phải khai báo không? Việc triển khai ở đâu? – user2030677

+0

Nó hầu như giống nhau, sự khác biệt chính là trình biên dịch C++ tự động liên kết với trình liên kết để liên kết với thư viện chuẩn (trong đó có thể có các phiên bản khác nhau, ví dụ như liên kết tĩnh/động, gỡ lỗi/tối ưu hóa, ...) tùy thuộc vào cờ trình biên dịch). Ngoài ra, hãy nhớ rằng nhiều tiêu đề chứa mã cho các hàm 'inline' (để cho phép trình biên dịch thực sự thực hiện nội tuyến) và các mẫu (và đó là lý do tại sao phần STL của thư viện chuẩn là chỉ tiêu đề). –

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