2009-04-14 5 views
5

Tôi đang sử dụng Visual C++ 2008, SP1. Tôi có một ứng dụng QT (gui, .exe) trong debug build config. Nó được thiết lập để sử dụng phiên bản DLL đa luồng Debug của CRT, còn gọi là MSVCRTD.lib.Làm thế nào để bạn xây dựng một debug .exe (MSVCRTD.lib) chống lại một phát hành xây dựng lib (MSVCRT.lib)?

Tôi đang liên kết với thư viện của bên thứ ba được xây dựng trong chế độ phát hành và sử dụng phiên bản DLL đa luồng (không gỡ lỗi) của CRT, còn gọi là MSVCRT.lib.

Liên kết và chạy nhưng gặp sự cố khi khởi động. Trong khi liên kết tôi nhận được cảnh báo:

LINK: warning LNK4098: defaultlib 'MSVCRT' xung đột với việc sử dụng các lib khác; sử dụng/NODEFAULTLIB: thư viện

tôi đã cố gắng thiết lập /NODEFAULTLIB:msvcrt.lib

nhưng điều đó dẫn đến 5 liên kết lỗi do những biểu tượng mất tích.

Vì vậy, không thể sử dụng hai libs khác nhau? Phương án thay thế là gì? Tôi có thể tạo một DLL ra khỏi lib của bên thứ 3 không? Hay đó là điều mà bên thứ ba sẽ phải làm?

Ngoại lệ lúc khởi động là:

"Unhandled ngoại lệ tại ....... trong MyApp.exe: ...... Truy cập vi phạm đọc vị trí 0x00000000f"

Sau đây là ngăn xếp cuộc gọi sau khi ứng dụng được chạy và nó bị treo:

MyApp.exe!std::_Aux_cont::_Getcont() + 0xa bytes C++ 
MyApp.exe!std::_Iterator_base_aux::_Getmycont() + 0x1b bytes C++ 
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::const_iterator::operator*() + 0x28 bytes C++ 
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::iterator::operator*() + 0xf bytes C++ 
MyApp.exe!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> > >::operator[]() + 0xe9 bytes C++ 
MyApp.exe!ThirdPartyLib::client::`anonymous namespace'::init_xlt_mode() + 0x5f bytes C++ 
[email protected]() + 0x8d8f3 bytes C++ 
msvcr90d.dll!_initterm(void (void)* * pfbegin=0x006c4468, void (void)* * pfend=0x006cb0b8) Line 903 C 
MyApp.exe!__tmainCRTStartup() Line 501 + 0xf bytes C 
MyApp.exe!WinMainCRTStartup() Line 403 C 
kernel32.dll!7c817067()  
+0

Bạn gặp sự cố gì khi khởi động? – LeopardSkinPillBoxHat

+0

Xin chào, tôi vừa cập nhật bài đăng gốc ở trên với nhiều chi tiết hơn và câu trả lời cho câu hỏi của bạn. – ApplePieIsGood

Trả lời

10

Bạn có thể tạo dự án của mình để liên kết với CRT phát hành và bật thông tin gỡ lỗi cho mã của bạn. Trong "Thuộc tính dự án", hãy chuyển tới C++/Chung và thay đổi Định dạng thông tin gỡ lỗi. Trong phần "Tối ưu hóa" tắt tối ưu hóa. Chuyển sang phần "Liên kết/gỡ lỗi" và cho phép tạo thông tin gỡ lỗi. Đảm bảo đặt tệp cơ sở dữ liệu chương trình (PDB).

Tại thời điểm này, ứng dụng của bạn sẽ phát ra thông tin gỡ lỗi cho mọi thứ trong mã của bạn và liên kết với CRT không gỡ lỗi DLL. Điều này cho phép bạn gỡ lỗi ứng dụng của mình trong cấu hình Phát hành trong khi tránh các sự cố liên quan đến việc sử dụng nhiều CRT trong cùng một ứng dụng.

+1

Bingo, đây là một cuộc sống tiết kiệm! Tôi đang cố gắng để đánh dấu câu trả lời này là giải pháp nhưng nó không cho phép tôi vì một lý do nào đó. Cảm ơn nhiều! – ApplePieIsGood

+0

Có điều đó tốt hơn. – ApplePieIsGood

2

Tôi đã gặp vấn đề tương tự khi trộn và kết hợp thư viện cấu hình gỡ lỗi và phát hành.

Trong khi điều này đôi khi có thể hoạt động, nó cũng có thể dẫn đến các sự cố không rõ ràng, chẳng hạn như bạn đang nhìn thấy (có thể do các điểm vào không khớp hoặc tương tự).

Các phương án như tôi nhìn thấy chúng là:

  • Xây dựng ứng dụng của bạn trong cấu hình phát hành (chỉ nó để MSVCRT.dll) và xem nếu làm việc này (bạn sẽ không thể để có được càng nhiều gỡ lỗi thông tin, nhưng nó có thể giúp cô lập nguồn gốc của vấn đề).

  • Nếu thư viện của bên thứ ba là nguồn mở, hãy thử tự xây dựng phiên bản Gỡ lỗi của tệp .lib.

  • Nếu không, hãy xem phiên bản gỡ lỗi có sẵn trực tuyến hay liên hệ với nhà cung cấp.

Rất tiếc, tôi không thể trợ giúp thêm. Tôi nghĩ rằng nó sẽ nhanh hơn trong thời gian dài nếu bạn có thể truy cập vào các thư viện chính xác sau đó cố gắng tìm ra cách để làm việc xung quanh nó.

+0

Tôi nên nói, nó hoạt động tốt khi tôi xây dựng ứng dụng của tôi trong chế độ Release, nhưng như bạn nói, tôi không thể gỡ lỗi nó cho bất cứ điều gì như xa như tôi có thể nói, mà làm cho mọi thứ sắp xếp vô nghĩa. Tôi hỏi các nhà cung cấp và họ lúc đầu dường như không nghĩ rằng họ có thể cung cấp một phiên bản gỡ lỗi. Tôi đang cố thuyết phục họ. – ApplePieIsGood