2011-07-28 30 views
13

Theo tôi biết nó không được xác định (hành vi không xác định) trong C++ STD cách ứng dụng đã biên dịch xử lý các tình huống khi một thư viện chia sẻ tăng ngoại lệ trong một thư mục khác [shared lib]. Mã được sản xuất bởi G ++/Linux cho thấy rằng có thể tăng ngoại lệ giữa các thư viện được chia sẻ.Ngoại lệ giữa các thư viện C++ chia sẻ trong g ++

Câu hỏi của tôi là:

  1. Có xách tay (MSVS)?
  2. Trong trường hợp nào thư viện được chia sẻ A sẽ không thể xử lý ngoại lệ từ thư viện được chia sẻ B? [Tôi có nghĩa là ứng dụng sẽ sụp đổ; thư viện A biết về các ngoại lệ có thể xảy ra từ B].
  3. Hành vi xử lý ngoại lệ trong ví dụ của tôi có phụ thuộc vào trình liên kết không?
+0

+1 Tôi đã lang thang như cũ trong một thời gian dài. Tôi đã nghe "huyền thoại" về "không có ngoại lệ trên các ranh giới thư viện được chia sẻ" từ lâu, nhưng vì thực tế tất cả các thư viện của bên thứ ba tôi sử dụng các ngoại lệ ném, tôi cho rằng đó là một huyền thoại. Đang đợi một số câu trả lời ... – davka

Trả lời

2

Điều này có vẻ là sự cố phụ thuộc vào trình biên dịch. Tôi đã gặp vấn đề với việc triển khai lên Windows, nơi MinGW-GCC phải được xây dựng bằng libstdC++ để cho phép xử lý ngoại lệ qua DLL (không phải mặc định cho phiên bản Debian và yêu cầu tôi biên dịch lại GCC).

Vì vậy, tôi cho rằng không có ABI chung giữa các trình biên dịch, vì GCC thậm chí không phù hợp với chính nó trong mọi khía cạnh. Đối với các cân nhắc kỹ thuật, thông tin xử lý ngoại lệ cấp thấp cần phải được lưu trữ ở đâu đó, và điều này ở đâu đó có khả năng là thư viện thứ ba C, mà xử lý các ngoại lệ. Trình biên dịch có thể chia sẻ thư viện này, nhưng tôi cho rằng chúng không có.

Về mặt tươi sáng: Tôi hiện đang biên soạn một dự án khá lớn cho các hệ thống POSIX và Windows và sử dụng nhiều ngoại lệ qua thư viện trong môi trường nhiều luồng. Nó hoạt động với một libstdC++ dùng chung cho GCC, và vì tất cả các thành phần đều là mã nguồn mở, tôi đã có sự đơn giản để biên dịch lại tất cả các phụ thuộc C++ cho MinGW.

3

Điều đó thực sự phụ thuộc vào việc bạn sử dụng thư viện được chia sẻ. Nếu bạn sử dụng chúng như các mô-đun vật lý trong cùng một ứng dụng/hệ thống và biên dịch chúng với cùng một trình biên dịch, bạn nên OK (miễn là bạn cũng liên kết động với thư viện chuẩn C++). Tuy nhiên, nếu có khả năng là một thư viện được biên dịch với một trình biên dịch (bao gồm một phiên bản khác của cùng một trình biên dịch) và được truy cập bởi một mô-đun được biên dịch bởi một trình biên dịch khác, bạn gặp rắc rối: không có khả năng tương thích nhị phân chuẩn giao diện cho trường hợp ngoại lệ.

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