Nếu thư viện thông thường/tĩnh, thư viện và ứng dụng phải được biên dịch bằng cùng một trình biên dịch. Có một vài lý do cho điều này mà tôi có thể nghĩ đến:
- Trình biên dịch khác nhau (như trong các thương hiệu hoặc trình biên dịch khác nhau) thường không hiểu định dạng thư viện và đối tượng của nhau.
- Bạn không muốn biên dịch các phần khác nhau của cùng một chương trình bằng cách sử dụng các loại khác nhau (ví dụ: ký kết hoặc unsigned char), loại kích cỡ (ví dụ: dài = 32 so với 64 bit), căn chỉnh và đóng gói và một số thứ khác được phép theo tiêu chuẩn C thay đổi. Trộn và kết hợp những thứ đó thường là một điều xấu.
Bạn có thể, tuy nhiên, thường sử dụng các phiên bản hơi khác nhau của cùng một trình biên dịch để biên dịch thư viện và ứng dụng sử dụng nó. Thông thường, không sao. Đôi khi có những thay đổi phá vỡ mã, mặc dù.
Bạn có thể thực hiện một số chức năng "khởi tạo" trong tệp tiêu đề (được khai báo là static inline
) để đảm bảo rằng loại, loại kích cỡ, căn chỉnh và đóng gói giống như mong đợi của thư viện được biên dịch. Ứng dụng sử dụng thư viện này sẽ phải gọi hàm này trước khi sử dụng bất kỳ phần nào khác của thư viện. Nếu mọi thứ không giống như mong đợi, chức năng phải thất bại và gây ra sự chấm dứt chương trình, có thể với một số mô tả văn bản tốt về sự thất bại. Điều này sẽ không giải quyết hoàn toàn vấn đề của việc có phần mềm biên dịch không tương thích, nhưng nó có thể ngăn chặn sự cố im lặng và bí ẩn. Một số điều có thể được kiểm tra bằng chỉ thị trước của #if
và #ifdef
và gây ra lỗi biên dịch với #error
.
Ngoài ra, các vấn đề về cấu trúc đóng gói có thể được giảm bớt bằng cách chèn byte đệm rõ ràng vào khai báo cấu trúc và buộc đóng gói chặt chẽ (ví dụ:sử dụng #pragma pack
, được hỗ trợ bởi nhiều trình biên dịch). Bằng cách đó, nếu kích thước loại giống nhau, nó sẽ không quan trọng những gì đóng gói mặc định là.
Bạn có thể áp dụng tương tự cho các tệp DLL, nhưng bạn thực sự mong rằng ứng dụng gọi đã được biên dịch bằng trình biên dịch khác và không phụ thuộc vào trình biên dịch giống nhau.
Nguồn
2011-12-18 05:27:56
Cảm ơn câu trả lời chi tiết. Bạn đã cho tôi một số điều mới để suy nghĩ. – MByD