2012-07-25 31 views
15

Thực tiễn không tốt là sử dụng phiên bản phát hành của thư viện của bên thứ ba trong gỡ lỗi nhị phân?Trộn gỡ lỗi và phát hành thư viện/nhị phân - thực hành không tốt?

Tôi đang sử dụng thư viện của bên thứ ba và đã biên soạn thư viện .lib phát hành. Exe của tôi là trong phát triển chế độ gỡ lỗi. Sau đó, tôi nhận:

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in test1.obj 

Sau khi một số googling tôi thấy đó là bởi vì tôi đang cố gắng để kết hợp phát hành với gỡ lỗi, và tôi có lẽ nên lập thư viện trong chế độ gỡ lỗi hoặc muddle với vĩ mô _ITERATOR_DEBUG_LEVEL. Nhưng tôi chỉ tò mò nếu đó là cách được giới thiệu và tại sao. Nó chỉ có vẻ cồng kềnh mà tôi cần biên dịch và lưu giữ một bản ghi của cả hai bản phát hành và gỡ lỗi nhị phân cho mỗi thư viện của bên thứ ba mà tôi dự định sử dụng, sẽ rất sớm, trong khi không có ý định gỡ lỗi vào các mã này.

+0

Bạn không thể liên hệ với bên thứ ba này để nhận phiên bản gỡ lỗi hoặc tự xây dựng phiên bản gỡ lỗi? –

+0

Đó là thực hành không tốt: nó gần như được đảm bảo rằng chương trình sẽ sụp đổ hoặc làm những điều xấu. Trước khi VS2010 bạn có thể liên kết, để khám phá tại các lỗi thời gian chạy lạ. Bây giờ ít nhất bạn bị ngăn cản. –

+1

@ JesseGood Có tôi có mã nguồn và tôi vừa biên soạn phiên bản gỡ lỗi. Đã giải quyết được sự cố. Tôi chỉ tự hỏi nếu tôi có thể lấy đi với biên dịch và theo dõi một chế độ. Rõ ràng là không! –

Trả lời

26

Trộn mã gỡ lỗi và phát hành là thực hành không tốt. Vấn đề là các phiên bản khác nhau có thể phụ thuộc vào các phần cơ bản khác nhau của thư viện thời gian C++, chẳng hạn như cách phân bổ bộ nhớ, cấu trúc cho những thứ như trình vòng lặp có thể khác, mã bổ sung có thể được tạo để thực hiện các hoạt động (ví dụ: trình vòng lặp đã kiểm tra).

Giống như trộn các tệp thư viện được xây dựng với bất kỳ cài đặt khác nào khác. Hãy tưởng tượng một trường hợp tệp tiêu đề chứa cấu trúc được cả ứng dụng và thư viện sử dụng. Thư viện được xây dựng với đóng gói cấu trúc và căn chỉnh được đặt thành một giá trị và ứng dụng được xây dựng với một giá trị khác. Không có đảm bảo rằng việc chuyển cấu trúc từ ứng dụng vào thư viện sẽ hoạt động vì chúng có thể thay đổi về kích thước và vị trí thành viên.

Có thể xây dựng thư viện của bên thứ ba dưới dạng tệp DLL không? Giả sử giao diện cho bất kỳ chức năng nào là sạch hơn và không cố gắng vượt qua bất kỳ đối tượng STL nào, bạn sẽ có thể kết hợp một ứng dụng gỡ rối với các bản phát hành DLL mà không gặp vấn đề gì.

+0

Cụ thể, các bộ chứa std và các bộ lặp là khác nhau và không tương thích. Đó là kiểm tra bạn đang thấy: nó ảnh hưởng đến bố cục của các trình vòng lặp bằng cách thêm các trường bổ sung. Các std :: string stuff (chỉ) có hỗ trợ cho khả năng tương thích giữa Debug và Release, nhưng không có gì khác trong stl sẽ làm việc ở tất cả. –

+2

@ JDługosz std :: chuỗi rõ ràng không tương thích giữa các thời gian chạy. Một bài tập giải trí là tạo một DLL chỉ với hàm '__declspec (dllexport) std :: string make_string()', xây dựng trong Debug, sau đó xây dựng một bản phát hành, liên kết và gọi hàm. Khi tôi cố gắng để 'std :: cout' chuỗi trả về, kết quả sụp đổ khá ấn tượng. Điều này đang sử dụng VS2013, nhưng nó chắc chắn là một vấn đề với VS2010 và tôi mong đợi các phiên bản khác là tốt. [Đây] (https://blogs.msdn.microsoft.com/vcblog/2014/06/10/the-great-c-runtime-crt-refactoring/) một chút thông tin từ miệng của con ngựa. – Rai

+0

Vâng, phiên bản cụ thể mà tôi đã đào sâu vào có mã để gỡ lỗi và giải phóng chuỗi std (vòng lặp hoặc giá trị; không nhớ nữa) tương thích. Tôi tin rằng đó là lớn hơn so với VS2010, nhưng tôi không nhớ chính xác nó đã được bao lâu rồi. –

5

Thực tế là nó không biên dịch phải đủ để chứng minh đó là thực hành xấu.

Về việc duy trì các bản dựng riêng biệt - bạn không cần phải làm điều đó. Đây là giải pháp mà trước đây đã làm việc cho tôi:

#ifdef _DEBUG 
#define DEBUG_WAS_DEFINED 
#undef _DEBUG 
#endif 

#include <culprit> 

#ifdef DEBUG_WAS_DEFINED 
#define _DEBUG 
#endif 

Hãy cho tôi biết nếu điều này phù hợp với bạn.

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