【问题标题】:Why does the MSCVRT library generate conflicts at link time? [duplicate]为什么 MSCVRT 库会在链接时产生冲突? [复制]
【发布时间】:2011-02-02 22:45:33
【问题描述】:

我正在 Visual C++ 2008 中构建一个项目,这是一个基于 MFC 的示例应用程序,用于一个静态 C++ 类库,我很快将在我自己的项目中使用。在构建调试配置时,我得到以下信息:

警告 LNK4098:defaultlib 'MSVCRT' 与使用其他库冲突;使用 /NODEFAULTLIB:library

使用推荐选项后(通过在调试配置的项目链接器设置中的“忽略特定库”字段中添加“msvcrt”),程序链接并运行良好。但是,我想知道为什么会发生这种冲突,为什么我必须忽略一个关键库,如果我以后会出现问题,我是否添加忽略,或者如果我不添加会发生什么(因为无论如何都会构建程序)。

同时Release配置警告:

警告 LNK4075:由于“/OPT:ICF”规范而忽略“/EDITANDCONTINUE”
警告 LNK4098:defaultlib 'MSVCRTD' 与其他库的使用冲突;使用 /NODEFAULTLIB:library

我猜“D”后缀意味着这是 vc++ 运行时的调试版本,不知道这次为什么要使用它。无论如何,将“msvcrtd”添加到忽略字段会导致表单的大量链接错误:

错误 LNK2001:无法解析的外部符号 __imp___CrtDbgReportW

非常感谢任何见解。

【问题讨论】:

    标签: c++ visual-studio linker msvcrt


    【解决方案1】:

    当您链接到使用另一个版本的 VC++ 运行时(项目属性中的C++ ->Code Generation->Runtime Library 设置)的静态库时,通常会发生这种情况。

    【讨论】:

    • 我在两种配置中都选择了 /MDd 并且警告消失了,猜测库是使用 RT 的调试版本构建的。仍然想知道为什么 MSVCRT 最终成为 Debug 构建的默认值,而 MSVCRTD 成为 Release 的默认值。在我看来,两者的默认值都应该是 MSVCRTD?
    • 也许这是库开发人员的错。 Debug 应该只用于调试构建——它的速度要慢得多。
    • 也有这个问题,谢谢帮助。
    【解决方案2】:

    这通常发生在我(不经意间)混合不同风格的 RTL 时,例如(在您的情况下)调试和发布或 MT 和 ST。

    【讨论】:

    • 两种配置都使用运行时的“多线程 DLL (/MD)”变体。还是你的意思是别的?
    • @neuviemeporte:请参阅Sharptooth 的回答,了解这仍然会发生。
    猜你喜欢
    • 2019-10-11
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2013-10-27
    • 2018-02-26
    • 2016-04-07
    相关资源
    最近更新 更多