微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐