https://social.msdn.microsoft.com/Forums/sqlserver/zh-CN/22942bc0-1804-425a-a533-b5ed1d7ce892/mfccstring
我新建了一个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呢
您好,
在非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的错误。
如果要使用MFC中的CString,则不能绕过MFC;
如果要使用ATL中的CString,则可以绕过MFC;