c – 如何删除警告LNK4217和LNK4049

前端之家收集整理的这篇文章主要介绍了c – 如何删除警告LNK4217和LNK4049前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有关于链接步骤的警告.这些警告只出现在释放模式.

我的程序由两部分组成:一个生成.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.

编译与可执行文件相同运行时的所有库也很重要,因此请检查运行时选择是否与所有项目匹配,并且链接适当版本的任何第三方库.

猜你在找的C&C++相关文章