zoukankan      html  css  js  c++  java
  • 继续折腾LNK 2005错误

    这次是因为要把一个很久的老项目改成使用Unicode字符集,又一次遇到了LNK 2005错误

    先说说怎么把老项目改成Unicode字符集吧,首先要有足够的信心能把项目改好,比如我这次改的项目,也不算很大,但是也有好几万行,一改成使用Unicode字符集编译后,瞬间出现上百个错误(VC2010碰到错误太多,超过一百个之后就会停止编译),不要看到数不清的错误之后就觉得改不好了,其实真正归纳起来需要改的就几种,改到最后只不过是体力活路问题,下面大概说一下,因为是事后写文,都是凭记忆,也许有遗漏的,如果有这方面需要的同学可以留言讨论。

    在我改动的项目里面,CString和char *到处混杂使用(是MFC程序),我是这样改的:

    1. 对于底层的函数绝对不要动,比如这样的:

    int IntConnect(const char *user, const char *pass, const char *ip)

    保证底层的函数依然用char *这样的形式,因为改动之后牵一发动全身,就没法改了,而且也没必要修改,怎么做看后面

    2. 对于使用可随字符集变化的函数用_T()

    CString CIni::GetString(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpDefault) const

    在使用的时候记得对书面字符串用_T()宏来转换,

    str = m_IniString.GetString(_T("*****"), _T("*****"), NULL);

    3. 用W2A()和A2W()宏来转换CString和其他宽字节字符变量

    举两个例子吧:

    #ifdef _UNICODE
    USES_CONVERSION;
    strAuth = EncodeTextBase64(A2W(test));
    #else
    strAuth = EncodeTextBase64(test);
    #endif

    #ifdef _UNICODE
    USES_CONVERSION;
    strcpy(pchIP, W2A(strIP));
    SetPassword(W2A(pchPassword));
    #else
    strcpy(pchIP, strIP);
    SetPassword(pchPassword);
    #endif

    最后来说说LNK 2005错误,先拷贝一段内容:

    http://zhanyonhu.blog.163.com/blog/static/16186044201023094754832/

    原因:

    CRT 库对 new、delete 和 DllMain 函数使用弱外部链接。MFC 库也包含 new、delete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。

    当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误时,可能会出现以下 LNK2005 错误。

    解决方法:

    强制链接器按照正确的顺序链接库!

    project->properties->Linker->Ignore Specific Library 添加 uafxcwd.lib Libcmtd.lib

    在Additional Dependencied添加uafxcwd.lib Libcmtd.lib

    注意,对于Debug和Release版本,还有动态和静态方式使用MFC,以及使用多线程库不同方式下,lib名称会稍有不同

    我这里使用的是uafxcw.lib;Libcmt.lib

    如果是使用多字节字符集编译的话,就是nafxcw.lib,如果是Debug版本的话,基本上为了区别,lib名称后面都会带一个d字母,比如Libcmtd.lib

    大概就这些,有问题的话可以大家讨论下。

  • 相关阅读:
    vue 3.0 项目搭建移动端 (七) 安装Vant
    vue 3.0 项目搭建移动端 (六) 命名路由同级控制
    vue 3.0 项目搭建移动端 (五) 没有配合webpack的情况下 引入 sass
    vue 3.0 项目搭建移动端 (四) 全局路由拦截 vue-router beforeEach
    移动端触屏滑动touches使用
    滑动时候警告:Unable to preventDefault inside passive event listener
    如何在同一台电脑上使用两个github账户(亲测有效)
    [转]GitHub上优秀的Go开源项目
    Github+HEXO FATAL bad indentation of a mapping entry at line 84
    eclipse在线安装jd反编译插件
  • 原文地址:https://www.cnblogs.com/s5689412/p/3808544.html
Copyright © 2011-2022 走看看