似乎我所有的成年生活都受到VC++链接器的折磨或抱怨,因为各种库都不同意使用哪个版本的Runtime库.我从来没有心情去掌握那个令人沮丧的话题.所以我只是试着搞砸它直到它起作用.错误消息永远不会有用.关于这个问题的微软文档也没有 - 至少对我来说不是.
有时它找不到函数 - 因为名称错误不是预期的?有时它拒绝混合搭配.其他时候它只是说,"LINK:警告LNK4098:defaultlib'LIBCMTD'与使用其他库冲突;使用/ NODEFAULTLIB:库" 使用/ NODEFAULTLIB不起作用,但警告似乎是良性的.到底是什么"DEFAULTLIB"?链接器如何决定?我从来没有见过一种方法来指定链接器使用哪个运行时库,只是告诉编译器哪个库创建函数调用.
有"依赖性walker"程序可以检查目标文件以查看它们依赖的DLL.我刚刚在一个正在尝试构建的项目上运行了一个,这真是一团糟.有系统.libs和.dll需要冲突的运行时版本.例如,COMCTL32.DLL需要MSVCRT.DLL,但我正在与MSVCRTD.DLL链接.我正在寻找是否有COMCTL32D.DLL,即使我输入.
所以我想我要求的是如何对这些东西进行排序的教程.你做什么,你怎么做?
这就是我想我所知道的.如果有任何错误,请纠正我.
参数是Debug/Release,Multi-threaded/Single-threaded和static/DLL.仅涵盖八种可能组合中的六种.没有单线程DLL,无论是Debug还是Release.
这些设置仅影响链接到哪个运行时库(以及与之链接的调用约定).例如,如果要构建DLL,则不必使用基于DLL的运行时,在构建程序的Debug版本时也不必使用Debug版本的运行时,尽管它似乎有助于单个踩过系统调用.
奖金问题:任何人或任何公司怎么会造成这样的混乱?
我有一个包含多个项目的解决方案.我有一个"主"项目,作为菜单,从那里,用户可以访问任何其他项目.在这个主项目中,我得到了每个被调用函数的链接器错误.如何避免这些链接器错误?我已经在"Project Dependencies ..."对话框中设置了项目依赖项.
谢谢
编辑 - 我按照建议做了,并将输出文件夹添加到链接器的其他目录中.但是,现在我得到了一百万个错误如下:
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int …Run Code Online (Sandbox Code Playgroud) 观察这个紧密的场景,即使它看起来与我以前的问题相同.我仍然没有得到答案.所以请不要作为重复报告.
我有一个有10个依赖项的项目.首先,我使用主项目中C/C++代码生成部分中的/ MTD选项进行编译,并且所有依赖项都已成功构建.
接下来,我将选项从/ MTD更改为/ MDd,并且所有相关项目再次成功构建.但是对于主项目,报告了以下错误:
LIBCMTD.lib(osfinfo.obj) : error LNK2005: __open_osfhandle already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(lseeki64.obj) : error LNK2005: __lseeki64 already defined in MSVCRTD.lib(MSVCR80D.dll)
sqlite3x.lib(sqlite3x_command.obj) : error LNK2005: "protected: wchar_t * __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::_Myptr(void)" (?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ) already defined in msvcprtd.lib(MSVCP80D.dll)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __mkdir already defined in LIBCMTD.lib(mkdir.obj)
MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __strdup already defined in
LIBCMTD.lib(strdup.obj)
Creating library Debug/Application.lib and object Debug/Application.exp
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library …Run Code Online (Sandbox Code Playgroud) 我正在编译项目并出现以下错误:
LIBCMTD.lib(_file.obj) : error LNK2005: ___iob_func already defined in MSVCRTD.lib(MSVCR90D.dll)
LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount already defined in MSVCRTD.lib(MSVCR90D.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRTD.lib(MSVCR90D.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRTD.lib(MSVCR90D.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __cexit already defined in MSVCRTD.lib(MSVCR90D.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRTD.lib(MSVCR90D.dll)
LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in MSVCRTD.lib(MSVCR90D.dll)
LIBCMTD.lib(fflush.obj) : error LNK2005: _fflush already defined in MSVCRTD.lib(MSVCR90D.dll)
LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook already defined …Run Code Online (Sandbox Code Playgroud)