2009-03-27 39 views
7

Ứng dụng My (C++, đa nền tảng) sử dụng nhiều thư viện Boost (nói phiên bản 1.x) và tôi cũng muốn liên kết với SDK của bên thứ ba (nhà cung cấp) (không có nguồn), sử dụng Boost (nhưng phiên bản) 1.y).Có thể nhiều phiên bản của cùng một (Boost) DLL cùng tồn tại trong cùng một quá trình không?

Vì vậy, cả hai chúng tôi liên kết động với phiên bản Boost DLL của riêng chúng tôi, CRT giống hệt nhau. Do đó, vào thời gian chạy, ứng dụng của tôi sẽ phải tải cả hai tệp DLL Boost 1.x & 1.y.

Các vấn đề tiềm năng & gotchas có liên quan gì?

Tôi không thể thay đổi SDK của nhà cung cấp, nhưng tôi có thể thay đổi ứng dụng của mình. Có lẽ tôi nên cố gắng liên kết tĩnh với Boost 1.x của tôi?

PS: Tên của Boost của DLL bao gồm phiên bản của chúng, vì vậy không có xung đột tên, cả hai đều có thể nhận dạng được. Không phải là DLL thông thường.

Trả lời

0

Nếu bạn viết hàm foo và xuất nó từ F.dll và một hàm khác foo được xuất từ ​​G.dll, bạn có gặp sự cố không?

Khi AF.exe được liên kết, trình liên kết được thông báo: đặt một số mã trong đó tải địa chỉ của hàm foo từ F.dll. Bây giờ BG.dll được liên kết để lấy địa chỉ foo từ G.dll. Tôi vẫn thấy không có vấn đề gì.

Bây giờ thay thế AF.exe bằng ứng dụng của bạn, BG.dll với ứng dụng của nhà cung cấp, F.dll với phiên bản tăng của bạn, G.dll với phiên bản tăng của nhà cung cấp.

Kết luận: Tôi thấy không có vấn đề gì nếu các tên dll khác nhau.

2

Khi sử dụng các tệp DLL cho các phiên bản khác nhau sẽ không có vấn đề gì. Ít nhất không phải trên Windows.

Điều này đúng nếu SDK đang sử dụng tăng nội bộ. Nếu SDK sử dụng các cấu trúc tăng cường trong giao diện của nó, ví dụ: nó có hàm trả về tăng :: tùy chọn, sau đó có nhiều phiên bản có thể gây ra sự cố. Nó vẫn có thể hoạt động tốt, phụ thuộc vào những thay đổi giữa các phiên bản, nhưng điều đó chắc chắn sẽ là một rủi ro. Tôi không biết bất kỳ giải pháp tốt trong trường hợp đó. Điều này cũng đúng nếu bạn bao gồm tệp tiêu đề SDK bao gồm tệp tiêu đề tăng cường.

2

Đây là một vấn đề lớn. Thực hiện tìm kiếm trên địa ngục DLL.

Về cơ bản, DLL (hoặc libs được chia sẻ trong Linux) được tải nhưng không phải tất cả các tên đều được giải quyết khi tải. Điều gì xảy ra là một đánh giá lười biếng, vì vậy các tên được đánh giá vào lần sử dụng đầu tiên. Vấn đề là nếu 2 dll có cùng tên thì vị trí mà tên được giải quyết phụ thuộc vào thứ tự mà DLL được tìm kiếm trong (tùy thuộc vào thứ tự tải).

Nếu bạn liên kết tĩnh thì bạn sẽ không gặp sự cố với các cuộc gọi phương thức vì tất cả sẽ được giải quyết tại thời gian biên dịch và bên thứ ba sẽ được giải quyết khi chạy từ DLL. Nhưng những gì về cấu trúc được tạo ra bởi boost-version. Nếu bạn sau đó chuyển chúng vào thư viện của bên thứ ba, sau đó chuyển nó tới phiên bản tăng-x. Các cấu trúc được sắp xếp theo cùng một cách?

Đây là một lĩnh vực rất phức tạp và khi các vấn đề xảy ra rất khó để loại bỏ lỗi. Vì vậy, hãy thử và sử dụng cùng một phiên bản.

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