构建时添加 /NODEFAULTLIB:library

Posted

技术标签:

【中文标题】构建时添加 /NODEFAULTLIB:library【英文标题】:Adding /NODEFAULTLIB:library when building 【发布时间】:2014-12-07 06:19:09 【问题描述】:

构建时出现以下错误:

1>------ Rebuild All started: Project: hw2_hci, Configuration: Release Win32 ------
1>  Source.cpp
1>Source.cpp(373): warning C4551: function call missing argument list
1>Source.cpp(627): warning C4551: function call missing argument list
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>glfw3.lib(wgl_context.obj) : error LNK2001: unresolved external symbol __imp__DescribePixelFormat@16
1>glfw3.lib(wgl_context.obj) : error LNK2001: unresolved external symbol __imp__SetPixelFormat@12
1>glfw3.lib(wgl_context.obj) : error LNK2001: unresolved external symbol __imp__SwapBuffers@4
1>glfw3.lib(win32_monitor.obj) : error LNK2001: unresolved external symbol __imp__CreateDCW@16
1>glfw3.lib(win32_gamma.obj) : error LNK2001: unresolved external symbol __imp__CreateDCW@16
1>glfw3.lib(win32_monitor.obj) : error LNK2001: unresolved external symbol __imp__DeleteDC@4
1>glfw3.lib(win32_gamma.obj) : error LNK2001: unresolved external symbol __imp__DeleteDC@4
1>glfw3.lib(win32_monitor.obj) : error LNK2001: unresolved external symbol __imp__GetDeviceCaps@8
1>glfw3.lib(win32_gamma.obj) : error LNK2001: unresolved external symbol __imp__GetDeviceGammaRamp@8
1>glfw3.lib(win32_gamma.obj) : error LNK2001: unresolved external symbol __imp__SetDeviceGammaRamp@8
1>C:\Users\student\Documents\VSTest\hw2_hci\Release\hw2_hci.exe : fatal error LNK1120: 8 unresolved externals
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

添加了以下相同的错误:

还有这个:

当我Use MFC in a Static Library 时出现此问题。为什么会这样?

正如有人建议转到 this 页面,我按照建议添加了以下内容,但它没有工作。

还有错误:

添加gdi32.lib后出现以下错误:

1>  Finished generating code
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _calloc already defined in LIBCMT.lib(calloc.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: __strdup already defined in LIBCMT.lib(strdup.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>C:\Users\student\Documents\VSTest\hw2_hci\Release\hw2_hci.exe : fatal error LNK1169: one or more multiply defined symbols found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

【问题讨论】:

您可能需要将 user32.lib 添加到附加依赖项中 @cup 我补充说,它实际上解决了一些问题!但是还有一些! 看来你也需要 gdi32.lib。 @cup 再次修复了一些错误,现在它正在显示其他错误! 看起来您需要编译为 /MD 而不是 /MT。这是最干净的解决方案。您可以 /NODEFAUTLIB:MSVCRT.lib 但这可能会导致随机无法解释的崩溃等问题。基本上,如果您的程序使用 DLL,请使用 /MD。对不依赖 DLL 的独立可执行文件使用 /MT。 【参考方案1】:

发生的情况是,一个或多个对象(可能在您正在使用的库中)指定的默认库要求与与您的项目使用的不同的运行时库链接。

docs on LNK4098 相当清楚发生了什么以及如何解决问题。

【讨论】:

所以你说glfw3.lib 在这种情况下使用Multi-threaded DLL (/MD)?因为我有使用Multi-threaded (/MT) 的项目?这是问题所在吗? (我很抱歉我是 Visual Studio C++ 的新手) 只是让您知道建议的帮助没有帮助!【参考方案2】:

不要在“附加选项”中添加要忽略的库,在链接器/输入/忽略特定默认库下添加它们(我看到您已经有 glfw3.lib,只需添加 libcmt.lib 用分号分隔)。

【讨论】:

以上是关于构建时添加 /NODEFAULTLIB:library的主要内容,如果未能解决你的问题,请参考以下文章

添加平台并使用离子科尔多瓦构建时出错?

构建时添加 /NODEFAULTLIB:library

使用部署项目创建发布时向构建添加标签

Ionic 3 - 添加或构建 iOS 应用程序时出错

IDEA如何在构建java程序时添加命令行参数

IDEA如何在构建java程序时添加命令行参数