MFC 设置静态链接的时候会有问题,动态链接能够正常运行。
2014-11-17 18:19
351 查看
MFC 设置静态链接的时候会有问题,动态链接能够正常运行。 运行库的几种方式都试过了,都不行。
1>------ 已启动生成: 项目: Music_Server_M, 配置: Debug Win32 ------ 1> 1> 正在搜索库 1> 正在搜索 libmysql.lib: 1> 正在搜索 miracl.lib: 1> 正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\lib\nafxcwd.lib: 1> 正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcmtd.lib: 1> 正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib: 1> 正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\user32.lib: 1> 正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\shell32.lib: 1> 正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\comctl32.lib: 1> 正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcpmtd.lib: 1> 正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\OLDNAMES.lib: 1> 正在搜索 C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\ws2_32.lib: 1> 正在搜索 D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\MSVCRTD.lib: 1>MSVCRTD.lib(MSVCR110D.dll) : error LNK2005: ___iob_func 已经在 libcmtd.lib(_file.obj) 中定义 1>MSVCRTD.lib(MSVCR110D.dll) : error LNK2005: _exit 已经在 libcmtd.lib(crt0dat.obj) 中定义 1>MSVCRTD.lib(MSVCR110D.dll) : error LNK2005: _calloc 已经在 libcmtd.lib(dbgcalloc.obj) 中定义 1>MSVCRTD.lib(MSVCR110D.dll) : error LNK2005: _free 已经在 libcmtd.lib(dbgfree.obj) 中定义 1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 libcmtd.lib(typinfo.obj) 中定义 1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 libcmtd.lib(typinfo.obj) 中定义 1> 已完成库搜索 1>C:\Users\suns\Documents\Visual Studio 2012\Projects\Music_Server_M\Debug\Music_Server_M.exe : fatal error LNK1169: 找到一个或多个多重定义的符号 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
VS2008,项目——属性——配置属性——C/C++——代码生成:他有/MT,/MTd,/Md,/MDd四个选项,你必须让所有使用的库都使用相同的配置,否则就会有相应的提示,甚至可能会出现无法解析的函数。有时我们使用的库不是自己可以控制的,那么就只能把工程属性设置成河你使用的库相同的选项。 错误 1 error LNK2005: _free 已经在 libcmtd.lib(dbgheap.obj) 中定义 MSVCRT.lib 错误 2 error LNK2005: _malloc 已经在 libcmtd.lib(dbgheap.obj) 中定义 MSVCRT.lib ..... 如果有一堆的重定义错误发生在同一个lib中,而且跟它冲突的也是同一个lib,那么这个两个lib的功能应该是一样的,可以2选一,只要在“忽略特定的库”内填入需要忽略的库。 项目属性-配置属性-链接器-输入-忽略特定的库:libcmtd.lib 项目属性-配置属性-常规-MFC的使用:在共享 DLL 中使用 MFC MSVCRT.lib 和libcmt.lib的冲突还是比较常见的。 从错误信息可以看出是msvcrt.lib和libcmt.lib库中重复定义了__isctype等符号。为什么会出现这样的问题呢?这就要从这两个库的作用说起了。 msvcrt.lib是VC中的Multithreaded DLL 版本的C运行时库,而libcmt.lib是Multithreaded的运行时库。在同一个项目中,所有的源文件必须链接相同的C运行时库。如果某一文 件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的库,也就是说用了不同的库,就会导致这个警告的出现。 告警信息的意思我们明白之后,就要找造成这个问题的原因了。在项目设置中我们可以看到当前项目使用的是Multithreaded非DLL版本的运 行时库,这说明项目中还有其他文件用到了不是这个版本的运行时库。很显然,就是openssl的静态库。查看openssl中ms下的nt.mak,我们 可以发现静态库版本中openssl使用编译开关/MD进行编译的,也就是说openssl静态库是默认用的Multithreaded DLL 版本的C运行时库。 原因找到了。那么解决方法,很明显有两个。总之就是将两个项目的运行时库统一。 简单的方式就是将项目的动态库修改为使用Multithreaded DLL 版本的C运行时库即可。 某些情况下你的项目可能不能改变当前的运行时库,你可以将openssl的nt.mak中的/MD开关修改为/MT然后重新编译openssl静态库就可以了。 默认库“library”与其他库的使用冲突;请使用 /NODEFAULTLIB:library LNK4098 的解决办法 您试图与不兼容的库链接。 注意 运行时库现在包含可防止混合不同类型的指令。如果试图在同一个程序中使用不同类型的运行 时库或使用调试和非调试版本的运行时库,则将收到此警告。例如,如 果编译一个文件以使用一种运行时库,而编译另一个文件以使用另一种运行时库(例如单线程运行时库对多线程运行时库),并试图链接它们,则将得到此警告。应 将所有源文件编译为使用同一个运行时库。有关更多信息,请参见使用运行时库(/MD、/MT 和 /LD)编译器选项。 可以 使用链接器的 /VERBOSE:LIB 开关来确定链接器搜索的库。如果收到 LNK4098,并想创建使用如单线程、非调试运行时库的可执行文件,请使用 /VERBOSE:LIB 选项确定链接器搜索的库。链接器作为搜索的库输出的应是 LIBC.lib,而非 LIBCMT.lib、MSVCRT.lib、LIBCD.lib、LIBCMTD.lib 和 MSVCRTD.lib。对每个要忽略的库可以使用 /NODEFAULTLIB,以通知链接器忽略错误的运行时库。 下表显示根据要使用的运行时库应忽略的库。 若要使用第一行运行时库 请忽略第2行的这些库 单线程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 多线程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 使用 DLL 的多线程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 调试单线程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd 4000 .lib 调试多线程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 使用 DLL 的调试多线程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib 例如,如果收到此警告,并希望创建使用非调试、单线程版本的运行时库的可执行文件,可以将下列选项与链接器一起使用: /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib
相关文章推荐
- 关于MFC里组合框控件设置好后编译运行不正常的原因和解决办法
- 一个小发现:Internet临时文件夹设置过小会影响一些网页的正常运行
- 在服务器上 .netFramework2.0 环境下,如何能在不改变服务器设置下,让站点能够运行 AJAX 程序
- asp.net 设置断点不起作用,正常运行程序
- eclipse3.7 开发的web项目,在本地没有问题,但是发布到linux上就有问题,不能正常运行的原因
- 修改SELinux设置,使vsftp在enforcing security enhance模式下正常运行(转)
- 让 VMWare Workstation 5.5.3 能够在 Ubuntu 7.04 (Feisty Fawn)中正常运行!
- 通过设置Ant中java和junit的dir属性来解决ant脚本只能在特定目录下正常运行
- QTP:当前安全设置禁止运行该页中的ActiveX控件。因此,该页无法正常显示
- 在服务器上 .netFramework2.0 环境下,如何能在不改变服务器设置下,让站点能够运行 AJAX 程序
- 组策略gpedit查看服务services,报安全设置禁止运行该页中activeX控件该页无法正常显示
- 让 VMWare Workstation 5.5.3 能够在 Ubuntu 7.04 (Feisty Fawn)中正常运行!
- [网站案例]IIS6.0应用程序池设置对网站正常运行的影响
- 让 VMWare Workstation 5.5.3 能够在 Ubuntu 7.04 (Feisty Fawn)中正常运行!
- MFC中Debug模式能够运行成功,但Release版本不能运行成功。
- 设置断点不运行的时候的处理办法
- 让 VMWare Workstation 5.5.3 能够在 Ubuntu 7.04 (Feisty Fawn)中正常运行!
- 网页中显示flash的时候部分显示红色叉好,而有的能够正常显示
- 修改SELinux设置,使vsftp在enforcing security enhance模式下正常运行
- (转) java -jar参数运行打包好的jar应用程序的时候发现应用程序无法找到classpath下设置好的第三方类库?