2010-07-08 25 views
5

Khi liên kết dll của tôi trong phiên bản build tôi nhận được -VC++/DEFAULTLIB vấn đề

1> LINK: cảnh báo LNK4098: defaultlib 'mfc80d.lib' mâu thuẫn với việc sử dụng libs khác; sử dụng/NODEFAULTLIB: thư viện

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

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

thêm/VERBOSE, tôi thấy như sau (đoạn): ...

1> Tìm kiếm D: \ Microsoft Visual Studio 8 \ VC \ atlmfc \ lib \ mfc80d.lib:

1> Found "công cộng: __thiscall ảo AFX_MODULE_STATE :: ~ AFX_MODULE_STATE (void)" (?? 1AFX_MODULE_STATE @@ UAE @ XZ) 1>
tham chiếu trong mfcs80.lib (dllmodul .obj) 1> Loaded mfc80d.lib (MFC80D.DLL)

1> Found "stdcall dài AfxWndProc (struct HWND__ *, unsigned int, unsigned int, long)" (? AfxWndProc @@ YGJPAUHWND __ @@ IIJ @ Z)

1> tham chiếu trong mfcs80.lib (dllmodul.obj) 1> Loaded mfc80d.lib (MFC80D.DLL)

...

Nếu tôi diễn giải chính xác điều này, điều đó có nghĩa là trình liên kết bằng cách nào đó sẽ giải quyết các cuộc gọi từ thư viện (tối ưu hóa) mfcs80, như các cuộc gọi vào thư viện (không được tối ưu hóa) mfc80D. Làm sao có thể??

Khi tôi thêm /NODEFAULTLIB:mfc80d.lib các cảnh báo đã biến mất, nhưng tôi chưa yên lặng với nó. Là một sang một bên, các mô-đun thực sự bị tai nạn không thể giải thích rời rạc trên các liên kết gia tăng, được giải quyết chỉ bằng một tái xây dựng. Tôi đang sử dụng VS2005.

[Chỉnh sửa:] Đã thay đổi tiêu đề để bao gồm DEFAULTLIB, hy vọng tập trung vào chủ thể tốt hơn. Tôi làm thấy một dòng rõ ràng nói

xử lý /DEFAULTLIB:mfc80d.lib

trong thư mục/đầu ra VERBOSE, trong số nhiều libs khác (không debug) mặc định. Nó đến từ đâu? Làm thế nào tôi có thể sửa lỗi này?

Cảm ơn!

Trả lời

2

Sự cố đã được giải quyết sau này - tôi đăng nó lên đây trong trường hợp nó giúp ai đó một ngày nào đó.

Hóa ra là đường dẫn tiêu đề biên dịch sai: cấu hình phát hành được trỏ đến đường dẫn PCH gỡ lỗi mặc định. Vì vậy, khi chuyển đổi từ gỡ lỗi sang bản phát hành, bản dựng sẽ kéo tất cả nội dung PCH gỡ lỗi - dường như bao gồm một số phiên bản gỡ lỗi của MFC#pragma (bình luận "lib ..") (được bao gồm trong các tiêu đề afx). Một xây dựng sạch sẽ xây dựng lại PCH một cách chính xác, nhưng một lần nữa vào thư mục gỡ lỗi - do đó gây ra vấn đề giống nhau về quá trình chuyển đổi trở lại để xây dựng gỡ lỗi.

2

Bạn nên kiểm tra cài đặt thư viện thời gian chạy cho các dự án của mình, có vẻ như bạn không khớp.Trong cài đặt dự án của bạn dưới C/C++> Code Generation> Runtime Library, bạn có sự lựa chọn:

  • Multi-Threaded
  • Multi-Threaded gỡ lỗi
  • Multi-Threaded DLL
  • Multi-Threaded gỡ lỗi DLL

Có vẻ như một số dự án trong giải pháp của bạn có thể đang sử dụng phiên bản Gỡ lỗi trong khi những người khác sử dụng phiên bản Không gỡ lỗi. Hoặc cách khác, một số dự án có thể đang sử dụng phiên bản Debug trong khi các dự án khác đang sử dụng phiên bản Debug DLL. Đối với cấu hình giải pháp đã cho, bạn muốn tất cả các dự án sử dụng cùng một cài đặt.

+0

Cảm ơn - nhưng tôi đã kiểm tra tất cả các dự án (và tất cả các file cá nhân), và tất cả họ đang biên soạn với/MD. Tôi có rất ít phụ thuộc bên ngoài: version.dll, shlwapi.dll và thành phần bên thứ 3 mà tôi đã kiểm tra với phụ thuộc-walker và dường như liên kết với các phiên bản CRT thích hợp (không gỡ lỗi). Trình chuyển đổi/MD có thực sự là quyền truy cập duy nhất vào khóa chuyển đổi/DEFAULTLIB không? Không có đầu vào nào khác có thể làm hỏng nó? –

0

Điều đó có nghĩa là một trong các dll phụ thuộc được biên dịch với run-time library khác.

Project -> Properties -> C/C++ -> Mã Generaion -> Runtime Library

Đi qua tất cả các thư viện và thấy rằng họ được biên soạn theo cùng một cách.

Thông tin thêm về lỗi này trong liên kết này:

warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs

+0

Khi tôi nhận xét về câu trả lời @bshields (giống hệt), tôi đã kiểm tra trước khi đăng bài ở đây. Xem câu trả lời của riêng tôi (~ 1 năm sau) cho nguồn vấn đề cuối cùng. –