2011-08-08 30 views
11

Tôi có cảnh báo về bước liên kết. Những cảnh báo này chỉ xuất hiện ở chế độ phát hành.Cách xóa cảnh báo LNK4217 và LNK4049

Chương trình của tôi bao gồm hai phần: thư viện tạo tệp .lib và tệp thực thi sử dụng thư viện này.

Khi tôi xây dựng thư viện, tôi không có cảnh báo. Nhưng khi tôi xây dựng tệp thực thi của mình, trên liên kết, tôi có cảnh báo LNK4217 và LNK4049. Ví dụ:

3>DaemonCommon.lib(Exception.obj) : warning LNK4217: locally defined symbol [email protected]@@[email protected]@Z (public: __thiscall std::exception::exception(char const * const &)) imported in function "public: __thiscall std::bad_alloc::bad_alloc(char const *)" ([email protected]@@[email protected]@Z) 
3>DaemonCommon.lib(CommAnetoException.obj) : warning LNK4217: locally defined symbol [email protected]@@[email protected]@Z (public: __thiscall std::exception::exception(char const * const &)) imported in function "public: __thiscall std::bad_alloc::bad_alloc(char const *)" ([email protected]@@[email protected]@Z) 

Tôi đã đọc trong MSDN, những cảnh báo này có thể do khai báo __declspec (dllimport). Nhưng, trong các lớp học của tôi về lib của tôi, tôi đã không có những thứ tuyên bố như thế này. Ví dụ, đây là lớp ngoại lệ của tôi:

#ifndef _EXCEPTION_HPP__ 
#define _EXCEPTION_HPP__ 

#include <string> 

namespace Exception 
{ 
    class Exception 
    { 
    public: 
     // Constructor by default 
     Exception(); 

     // Constructor parametrized 
     Exception(std::string& strMessage); 

     // Get the message of the exception 
     virtual std::string getMessage() const; 

     // Destructor 
     virtual ~Exception(); 

    protected: 

     // String containing the message of the exception 
     std::string mStrMessage; 
    }; 
} 

#endif 

Có thể ai đó cho tôi biết lý do tại sao những cảnh báo này xuất hiện và làm thế nào để xóa chúng?

Trả lời

17

Đó là do __declspec(import)trên các biểu tượng được đề cập là "đã nhập", tức là. trên public: __thiscall std::exception::exception(char const * const &). Điều đó có thể do không khớp giữa tùy chọn trình biên dịch để lựa chọn thời gian chạy (/MT (thời gian chạy đa luồng tĩnh) v.s. /MD (thời gian chạy động)) và các tùy chọn tiền xử lý (_DLL xác định). Đặc biệt, những cảnh báo đó sẽ xuất hiện nếu bạn biên dịch với /MT (hoặc /MTd trong cấu hình gỡ lỗi), nhưng _DLL bằng cách nào đó đã được xác định.

Vì vậy, hãy đảm bảo bạn không xác định _DLL khi không biên dịch với /MD. Nó cũng rất quan trọng để biên dịch tất cả các thư viện trong cùng một thời gian chạy như thực thi, vì vậy hãy kiểm tra xem lựa chọn thời gian chạy phù hợp với tất cả các dự án và bạn đang liên kết phiên bản thích hợp của bất kỳ thư viện của bên thứ ba nào.

+2

Thực tế, điều này là do dự án thực thi của tôi được xác định trên "Multi-threaded DLL \ MD" thay vì "Multi-threaded \ MT" ... Tôi không biết tại sao. .. Cảm ơn ;-) – Cedekasme

0

Điều này không liên quan đến vấn đề của OP, nhưng tôi cũng đã thấy LNK4217 khi liên kết trong thư viện cục bộ với tệp thực thi, nơi không có thư viện thời gian chạy không khớp.

Một số thư viện yêu cầu định nghĩa tiền xử lý khi xây dựng chúng dưới dạng tĩnh (bất kể thời gian chạy tĩnh hoặc động được sử dụng). Ví dụ, libzmq (0MQ) yêu cầu ký hiệu ZMQ_STATIC được định nghĩa khi xây dựng một thư viện tĩnh. Nếu không, bạn sẽ nhận được LN2417 khi liên kết thư viện của bạn thành một tệp thực thi.

1

Sự không khớp của __declspec (dllexport)/__ declspec (dllimport) cũng có thể xảy ra do các hàm/lớp được định nghĩa tiêu đề; Ví dụ: Bạn đang xây dựng một thư viện dùng chung (.dll), sử dụng một hỗn hợp các hàm/lớp "Chỉ"/"Chỉ" và các hàm/lớp liên kết (không có tệp giao diện cụ thể) cần sử dụng __declspec (dllexport) trong khi biên dịch lib và __declspec được chia sẻ (dllimport) trong khi sử dụng nó). Một lỗi phổ biến là xác định __declspec (dllexport)/__ declspec (dllimport) cho các phần thực sự là phần đầu và do đó không phải là một phần của chính lib đã biên dịch.

0

Một số info từ Russ Keldorph về những gì declspec (dllimport) thực sự làm. (Đề xuất sử dụng công tắc /QSimplicit-import-.)

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