MFC扩展DLL,函数参数或返回值中有&,调用时报无法解析的外部符号

女神打Boss 2020-11-18 10:16:43
代码如下
#pragma once

#ifndef testMfcDll_H
#define testMfcDll_H


class __declspec(dllexport) testMfcDll;

class testMfcDll
{
public:
testMfcDll(){};
virtual ~testMfcDll(){};
void sayHello();
CString &sayHelloWord();
void sayWhat(CString &);

CString strHello;
};

#endif


// testMfcDll.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "testMfcDll.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

void testMfcDll::sayHello()
{
//这是win的MessageBox
MessageBox(NULL, _T("hello"), _T("提示"), MB_OK);
}


CString& testMfcDll::sayHelloWord()
{
strHello = _T("hello world");
return strHello;
}


void testMfcDll::sayWhat(CString &str)
{
if(str == _T("hello"))
{
str = _T("get way");
MessageBox(NULL, _T("get way"), _T("提示"), MB_OK);
}else
{
MessageBox(NULL, _T("hello"), _T("提示"), MB_OK);
}
}


调用代码
	testMfcDll test;
test.sayHello();//只调用这个可以正常运行
CString str = _T("hello");
str = test.sayHelloWord();//这个编译不过
test.sayWhat(str);//这个编译不过
MessageBox(str);


错误信息
1>testADODlg.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall testMfcDll::sayWhat(class ATL::CStringT<wchar_t,class StrTraitMFC<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > &)" (?sayWhat@testMfcDll@@QAEXAAV?$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z),该符号在函数 xxx 中被引用
1>testADODlg.obj : error LNK2019: 无法解析的外部符号 "public: class ATL::CStringT<wchar_t,class StrTraitMFC<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > & __thiscall testMfcDll::sayHelloWord(void)" (?sayHelloWord@testMfcDll@@QAEAAV?$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@XZ),该符号在函数 xxx中被引用
...全文
542 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmcanyu 2020-11-19
  • 打赏
  • 举报
回复
Lib文件没包含进来
Yofoo 2020-11-18
  • 打赏
  • 举报
回复
提示是符号找不到, 如果 sayHello 正常应该整体逻辑是正常的, 应该是部分申明和定义不一致, CString 申明比较复杂, 部分编译器CString 有两套 MFC, 和 ATL, 从上面看exe应该是ATL的, 如果跟dll不一致肯定会有问题 另外CString 比如unicode环境 是CStringW, 其他也可能是CStringA, 在exe,dll如果不一致也会出现符号找不到 另外不同模块之间不推荐使用 CString, 因为不容模块的内存管理是分离的, 交叉使用会出现错误, 推荐用 char*, 或者wchar_t*
女神打Boss 2020-11-18
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
strHello = _T("hello world"); strHello 在 哪里 定义 ?
这个是testMfcDll类的成员变量,在.h中有定义
schlafenhamster 2020-11-18
  • 打赏
  • 举报
回复
strHello = _T("hello world"); strHello 在 哪里 定义 ?
zgl7903 2020-11-18
  • 打赏
  • 举报
回复
DLL 接口中 尽量使用基本类型, 不要使用MFC类
女神打Boss 2020-11-18
  • 打赏
  • 举报
回复
接上一楼的问题,创建MFC DLL 项目时的向导中有选择DLL类型,有3种类型,mfc扩展dll, 静态,共享,选择以后就不能在项目属性里面改了 这里的静态 共享 要和exe的静态 共享属性对应,就可以用MFC的东西来封装dll了 但是这里有个问题就是静态和共享dll自带了CWinApp,不知道是啥意思 所以MFC封装dll有2条路,1是上面说的这个 2是把MFC的类型改成char*之类的通用类型 感谢3楼提供思路
女神打Boss 2020-11-18
  • 打赏
  • 举报
回复
引用 3 楼 Yofoo 的回复:
提示是符号找不到, 如果 sayHello 正常应该整体逻辑是正常的, 应该是部分申明和定义不一致, CString 申明比较复杂, 部分编译器CString 有两套 MFC, 和 ATL, 从上面看exe应该是ATL的, 如果跟dll不一致肯定会有问题 另外CString 比如unicode环境 是CStringW, 其他也可能是CStringA, 在exe,dll如果不一致也会出现符号找不到 另外不同模块之间不推荐使用 CString, 因为不容模块的内存管理是分离的, 交叉使用会出现错误, 推荐用 char*, 或者wchar_t*
是你说的这个问题,有个选项,“在共享DLL中使用MFC”exe 和 dll 程序的这个选项要一致就成功了 我是在“在共享DLL中使用MFC”就成功运行了,但是“在静态中使用MFC”编译的dll竟然编译失败,我再找找bug

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧