2010-01-06 31 views
6

Tôi đã viết một thư viện lớp trong C + + và thành công biên dịch nó trong Linux với g + + như một đối tượng chia sẻ, sau đó tạo ra một vài ứng dụng sử dụng nó. Bây giờ tôi phải chuyển nó sang VS2008. Tôi đã cho tất cả các lớp các tiền tố __declspec (dllexport) bắt buộc, sau đó cố gắng biên dịch nó. Tôi nhận được một đống cảnh báo, mà về cơ bản phải làm với:vấn đề với porting một DLL C + + lớp thư viện để Visual Studio

  1. lớp ngoại lệ tùy chỉnh của tôi, xuất phát từ std :: runtime_error, mà năng suất: "cảnh báo C4275: không lớp dll giao diện 'std :: runtime_error 'được sử dụng làm cơ sở cho lớp giao diện dll' cci :: FileOperationException '". Làm thế nào tôi phải làm cho một lớp thư viện tiêu chuẩn dll-exportable?
  2. thông số ngoại lệ trong khai báo hàm của thành viên, điều này gây ra "cảnh báo C4290: đặc điểm ngoại lệ C++ bị bỏ qua ngoại trừ cho biết hàm không phải là __declspec (nothrow)". Tôi đọc ở đâu đó rằng VS không hỗ trợ những điều này, và nó làm ở một nơi khác. Làm thế nào rất khó hiểu.

Tôi đọc mọi người nói rằng xuất các lớp trong DLL thường là một ý tưởng tồi, có vô số thứ có thể sai, và bây giờ tôi có đầu đầy khái niệm như không tương thích nhị phân, dll hell, compiler phiên bản không phù hợp vv, và thành thật mà nói, tôi không thể tạo ra đầu hay đuôi của nó. Cách chính xác, an toàn và dễ dàng để tạo thư viện lớp dùng chung trong Windows là gì?

Cảm ơn.

+3

Có thực sự cần phải là một DLL không? Tạo một thư viện tĩnh sẽ tránh được nhiều vấn đề. –

+1

Điểm tốt. :) Câu hỏi ban đầu vẫn còn đứng, mặc dù - mọi người có thể sử dụng DLL bằng cách nào đó, phải không? (Ngoài ra, bất kỳ cách dễ dàng để thay đổi xây dựng từ chia sẻ đến tĩnh? Sẽ Project-> Properties-> General-> Configuration Type-> Static Library là đủ?) – neuviemeporte

+0

Họ đang sử dụng chúng, nhưng không phải là không có nhiều nhảy hoop. IMHO, một thư viện tĩnh luôn luôn là sự lựa chọn đầu tiên. –

Trả lời

2

Tôi duy trì a C++ class library thường được sử dụng làm DLL trên Windows, vì vậy có thể thực hiện được. Liên quan đến vấn đề của bạn:

  1. Điều đó không xảy ra trong thư viện của tôi. Có lẽ bạn cần phải sử dụng tùy chọn xây dựng/MD và/MDd? Bằng cách đó, thư viện thời gian chạy C++ của bạn cũng xuất phát từ một tệp DLL, đó là loại điều cầu kỳ mà VC++ nổi tiếng.

  2. Không sử dụng thông số kỹ thuật ném. They are evil. Nếu bạn cảm thấy bạn phải làm điều đó anyway, chỉ cần đặt một cái gì đó như thế này trong một tập tin tiêu đề mà mỗi mô-đun bao gồm trước khi nó được mã sử dụng ném-specs.

#pragma cảnh báo (vô hiệu hóa: 4290)

+0

Tôi đang sử dụng/MD, không trợ giúp. Whacked tất cả các ES của mặc dù, sau khi đọc bài viết, cảm ơn. – neuviemeporte

+1

Nói chung, sau đó, bạn có thể tải xuống MySQL ++ và xem xét cài đặt dự án của nó để xem lý do tại sao tôi hoạt động và máy của bạn không hoạt động. MySQL ++ làm một cái gì đó tương tự như thư viện của bạn: xem lib/exceptions.h, nơi chúng tôi lấy được một mysqlpp tùy chỉnh :: lớp ngoại lệ từ std :: exception. –

+1

Đó là bởi vì rõ ràng std :: exception * được * xuất khẩu trong Microsoft-land. Thay đổi của tôi với nó, cảnh báo đã biến mất. – neuviemeporte

1

Trước tiên, bạn nên tự hỏi mình nếu bạn thực sự cần một thư viện động ở đây. Các thư viện tĩnh hoặc thậm chí tốt hơn bao gồm mã nguồn trực tiếp trong dự án của bạn là một giải pháp tốt mà không có những vấn đề đó.

Nếu bạn thực sự cần DLL, cách tôi sẽ thực hiện việc này (được cung cấp nhiều thời gian) đang gói lớp của bạn trong giao diện C. Sau đó, bạn có thể tạo lại giao diện C++ cũ của mình dưới dạng thư viện chỉ có tiêu đề C++ chỉ tương tác với các cuộc gọi C được xuất từ ​​tệp DLL. Một tính năng tiền thưởng cho cách tiếp cận này là nó sẽ là tầm thường để sử dụng thư viện của bạn từ hầu như bất kỳ ngôn ngữ lập trình nào vì việc nhập các hàm C từ DLL được hỗ trợ rất cao.

Một cách khác để sử dụng là sử dụng COM nhưng vì bạn đang chuyển từ Linux, đây có lẽ không phải là một tùy chọn.

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