我有关于链接步骤的警告.这些警告只出现在释放模式.
我的程序由两部分组成:一个生成.lib的库和一个使用该库的可执行文件.
当我建立图书馆时,我没有任何警告.但是当我构建我的可执行文件,在链接上我有警告LNK4217和LNK4049.例如:
3>DaemonCommon.lib(Exception.obj) : warning LNK4217: locally defined symbol ??0exception@std@@QAE@ABQBD@Z (public: __thiscall std::exception::exception(char const * const &)) imported in function "public: __thiscall std::bad_alloc::bad_alloc(char const *)" (??0bad_alloc@std@@QAE@PBD@Z) 3>DaemonCommon.lib(CommAnetoException.obj) : warning LNK4217: locally defined symbol ??0exception@std@@QAE@ABQBD@Z (public: __thiscall std::exception::exception(char const * const &)) imported in function "public: __thiscall std::bad_alloc::bad_alloc(char const *)" (??0bad_alloc@std@@QAE@PBD@Z)
我已经在MSDN中阅读过,这些警告可能是由__declspec(dllimport)的声明引起的.但是,在我的lib类中,我没有像这样宣告的东西.例如,这里是我的类异常:
#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
有人可以告诉我为什么会出现这些警告,以及如何删除它们?
解决方法
这是由__declspec(导入)引起的,被称为“进口”的符号,即. on public:__thiscall std :: exception :: exception(char const * const&).这可能是由运行时选择的编译器选项(/ MT(静态多线程运行时)v.s./ MD(动态运行时))与预处理器选项(_DLL定义)之间的不匹配引起的.特别是如果您使用/ MT(或调试配置中的/ MTd)编译但是_DLL以某种方式被定义,则会出现这些警告.
所以确保在不使用/ MD进行编译时不定义_DLL.