2010-03-02 20 views
12

Dường như tất cả cuộc sống người lớn của tôi, tôi đã bị tấn công bởi người liên kết VC++ phàn nàn hoặc balking vì các thư viện khác nhau không đồng ý về phiên bản của thư viện Runtime để sử dụng. Tôi không bao giờ trong tâm trạng để làm chủ chủ đề ảm đạm đó. Vì vậy, tôi chỉ cố gắng để gây rối với nó cho đến khi nó hoạt động. Các thông báo lỗi không bao giờ hữu ích. Không phải là tài liệu của Microsoft về chủ đề - không phải với tôi ít nhất.Thư viện thời gian chạy sai và VC++ - Ồ, sự đau khổ!

Thỉnh thoảng nó không tìm thấy chức năng - vì tên mangling không phải là những gì được mong đợi? Đôi khi nó từ chối trộn và kết hợp. Lần khác nó chỉ nói, "LINK: cảnh báo LNK4098: defaultlib 'LIBCMTD' xung đột với việc sử dụng các libs khác; sử dụng/NODEFAULTLIB: thư viện" Sử dụng/NODEFAULTLIB không hoạt động, nhưng cảnh báo có vẻ là lành tính. Cái quái gì là "DEFAULTLIB"? Làm thế nào để mối liên kết quyết định? Tôi chưa bao giờ thấy một cách để chỉ định cho trình liên kết mà thư viện thời gian chạy để sử dụng, chỉ làm thế nào để nói cho trình biên dịch mà thư viện để tạo ra các cuộc gọi chức năng cho.

Có các chương trình "người phụ thuộc tập đi" có thể kiểm tra tệp đối tượng để xem chúng phụ thuộc vào loại tệp DLL nào. Tôi chỉ chạy một dự án mà tôi đang cố gắng xây dựng, và đó là một mớ hỗn độn thực sự. Có các hệ thống .libs và .dll muốn các phiên bản thời gian chạy xung đột. Ví dụ, COMCTL32.DLL muốn MSVCRT.DLL, nhưng tôi đang liên kết với MSVCRTD.DLL. Tôi đang tìm kiếm để xem nếu có một COMCTL32D.DLL, ngay cả khi tôi gõ.

Vì vậy, tôi đoán những gì tôi yêu cầu là một hướng dẫn về cách sắp xếp những điều đó. Bạn làm gì, và làm thế nào để bạn làm điều đó?

Đây là những gì tôi nghĩ tôi biết. Xin vui lòng sửa tôi nếu bất kỳ điều này là sai.

  1. Các tham số là Gỡ lỗi/Phát hành, Đa luồng/Single-luồng và static/DLL. Chỉ có sáu trong tám kết hợp có thể được bảo hiểm. Không có DLL đơn luồng, hoặc Debug hoặc Release.

  2. Cài đặt chỉ ảnh hưởng đến thư viện thời gian nào được liên kết trong (và quy ước gọi để liên kết với nó). Ví dụ, bạn không phải sử dụng thời gian chạy dựa trên DLL nếu bạn đang xây dựng một DLL, cũng như bạn không phải sử dụng một phiên bản Debug của thời gian chạy khi xây dựng phiên bản Debug của một chương trình, mặc dù nó có vẻ hữu ích khi đơn bước qua các cuộc gọi hệ thống.

Câu hỏi tiền thưởng: Mọi người hoặc công ty nào có thể tạo ra một mớ hỗn độn như vậy?

Trả lời

3

Điểm của bạn (1) và (2) trông chính xác với tôi. Một điều cần lưu ý với (2) là liên kết trong CRT gỡ lỗi cũng cung cấp cho bạn quyền truy cập vào những thứ như kiểm tra heap nâng cao, kiểm tra vòng lặp và kiểm tra sanity các loại khác. Tuy nhiên, bạn không thể phân phối lại CRT gỡ lỗi với ứng dụng của mình - bạn phải chỉ sử dụng bản phát hành bản phát hành. Nó không chỉ được yêu cầu bởi giấy phép VC, nhưng bạn có thể không muốn được vận chuyển các tệp nhị phân gỡ lỗi.

Không có điều nào như COMCTL32D.DLL. Các tệp DLL là một phần của Windows phải tải CRT mà chúng được liên kết với nhau khi Windows được xây dựng - điều này được bao gồm trong hệ điều hành là MSVCRT.DLL. CRT Windows này hoàn toàn độc lập với Visual C++ CRT được nạp bởi các mô-đun bao gồm chương trình của bạn (MSVCRT.DLL là một trong đó tàu với Windows. VC CRT sẽ bao gồm một số phiên bản, ví dụ MSVCRT80.DLL). Chỉ các tệp EXE và DLL tạo thành chương trình của bạn bị ảnh hưởng bởi cài đặt gỡ lỗi/phát hành đa luồng/đơn luồng.

Thực tiễn tốt nhất ở đây IMO là chọn cài đặt cho CRT của bạn và chuẩn hóa cho cài đặt cho mọi nhị phân mà bạn gửi. Tôi cá nhân sử dụng thời gian chạy DLL đa luồng. Điều này là do Microsoft có thể (và không) phát hành các bản cập nhật bảo mật và sửa lỗi cho CRT có thể được đẩy ra thông qua Windows Update.

+0

Tuyệt vời! Tôi nghĩ rằng tôi hiểu, nhưng bảo lưu quyền đặt câu hỏi khi tôi chắc chắn khám phá ra rằng tôi không. BTW, trên dự án mà tôi đang làm việc, tôi nhận được cả Release và Debug để liên kết và chạy, nhưng phiên bản Release cho tôi biết, "LINK: cảnh báo LNK4098: defaultlib 'LIBCMT' xung đột với việc sử dụng các lib khác;/NODEFAULTLIB: thư viện. " Điều này gây nhầm lẫn với tôi, bởi vì tôi đã chọn Multi-threaded-DLL để tạo mã (/ MD). Phiên bản gỡ lỗi liên kết sạch sẽ. Tôi đang liên kết với wxWidgets, lcms, opencv, và bất cứ thứ gì khác kéo vào. –

+1

Tôi đã khám phá cách "sử dụng/NODEFAULTLIB: libray" có hiệu lực với IDE VC++. Hiển thị "Thuộc tính" và sau đó nhấp vào trang "Trình liên kết/Nhập". Đặt tên của DEFAULTLIB vi phạm vào hộp văn bản "Bỏ qua thư viện cụ thể". –

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