none
在非MFC项目中使用CString RRS feed

  • 问题

  • 我新建了一个C++空项目,设置了多线程调试,共享DLL中使用MFC,引用大致是这样

    #if !defined(_MINISQL_H_)
    #define _MINISQL_H_

    #include<afx.h>
    #include<iostream>
    #include<atlstr.h> 
    #include<stdlib.h>
    #include<math.h>
    #include<direct.h>

    然后在下文中使用了CString,然后提示错误

    错误 3 error LNK2019: 无法解析的外部符号 "class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > __cdecl use_clause(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >,int)" (?use_clause@@YA?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@V12@H@Z),该符号在函数 "class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > __cdecl Interpreter(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >)" (?Interpreter@@YA?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@V12@@Z) 中被引用 C:\Users\Administrator\Desktop\作业\MiniSQL\Interpreter.obj MiniSQL

    错误 4 error LNK2019: 无法解析的外部符号 "class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > __cdecl delete_clause(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >,int)" (?delete_clause@@YA?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@V12@H@Z),该符号在函数 "class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > __cdecl Interpreter(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >)" (?Interpreter@@YA?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@V12@@Z) 中被引用 C:\Users\Administrator\Desktop\作业\MiniSQL\Interpreter.obj MiniSQL

    要怎样才能绕过MFC使用CString呢

    2012年9月15日 12:06

答案

  • 您好,

    在非MFC工程中使用CString类,只要包含atlstr.h头文件就可以了,也不需要设置“共享DLL中使用MFC”。

    如果包含afx.h也可以,但是afx.h还包含了很多额外的东西,并且必须设置“共享DLL中使用MFC”。此外,包含了Windows.h的工程不能再包含afx.h头文件。

    关于上述的错误信息,是因为同时引用了atlstr.h和afx.h两个头文件。而CString类型的默认模板在MFC(afx.h)和ATL(atlstr.h)中是不一样的。相当于CString类型在程序中有两种不同的实现,导致LNK2019的错误。


    Damon Zheng [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 ghvg1313 2012年9月18日 16:35
    2012年9月17日 8:01
    版主

全部回复

  • 如果要使用MFC中的CString,则不能绕过MFC;

    如果要使用ATL中的CString,则可以绕过MFC;

    2012年9月17日 7:17
  • 您好,

    在非MFC工程中使用CString类,只要包含atlstr.h头文件就可以了,也不需要设置“共享DLL中使用MFC”。

    如果包含afx.h也可以,但是afx.h还包含了很多额外的东西,并且必须设置“共享DLL中使用MFC”。此外,包含了Windows.h的工程不能再包含afx.h头文件。

    关于上述的错误信息,是因为同时引用了atlstr.h和afx.h两个头文件。而CString类型的默认模板在MFC(afx.h)和ATL(atlstr.h)中是不一样的。相当于CString类型在程序中有两种不同的实现,导致LNK2019的错误。


    Damon Zheng [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 ghvg1313 2012年9月18日 16:35
    2012年9月17日 8:01
    版主