在 CSerialPort::WriteToPort编译中error LNK2019: 无法解析的外部符号 “char * __cdecl UnicodeToAnsi(wchar_t const *)

1> SerialPort.cpp
1>e:\vs2015\mfcserialport\mfcserialport\serialport.cpp(417): warning C4477: “sprintf”: 格式字符串“%s”需要类型“char *”的参数,但可变参数 2 拥有了类型“LPVOID”
1> MFCSerialPortDlg.cpp
1> MFCSerialPort.cpp
1> GlobalFunc.cpp
1> 正在生成代码...
1>SerialPort.obj : error LNK2019: 无法解析的外部符号 "char * __cdecl UnicodeToAnsi(wchar_t const *)" (?UnicodeToAnsi@@YAPADPB_W@Z),该符号在函数 "public: void __thiscall CSerialPort::WriteToPort(wchar_t const *)" (?WriteToPort@CSerialPort@@QAEXPB_W@Z) 中被引用
1>E:\VS2015\MFCSerialPort\Debug\MFCSerialPort.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

本来在其他工程中用得好好的移植了SerialPort.cpp中的CSerialPort类,新建一个工程结果出现这个错误,让我很难受,一时半会又找不到以前是怎么解决的,以前也好像没出现过

我在cpp文件中定义代码

1
2
3
4
5
6
7
8
9
10
11
inline char* UnicodeToAnsi(const wchar_t* szStr)
{
    int nLen = WideCharToMultiByte(CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL);
    if (nLen == 0)
    {
        return NULL;
    }
    char* pResult = new char[nLen];
    WideCharToMultiByte(CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL);
    return pResult;
}

然后我去掉inline后发现编译正常了,这是什么原理?????

1
2
3
4
5
6
7
8
9
10
11
char* UnicodeToAnsi(const wchar_t* szStr)
{
    int nLen = WideCharToMultiByte(CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL);
    if (nLen == 0)
    {
        return NULL;
    }
    char* pResult = new char[nLen];
    WideCharToMultiByte(CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL);
    return pResult;
}

1> stdafx.cpp
1> SerialPort.cpp
1>e:\vs2015\mfcserialport\mfcserialport\serialport.cpp(417): warning C4477: “sprintf”: 格式字符串“%s”需要类型“char *”的参数,但可变参数 2 拥有了类型“LPVOID”
1> MFCSerialPortDlg.cpp
1> MFCSerialPort.cpp
1> GlobalFunc.cpp
1> 正在生成代码...
1> MFCSerialPort.vcxproj -> E:\VS2015\MFCSerialPort\Debug\MFCSerialPort.exe
1> MFCSerialPort.vcxproj -> E:\VS2015\MFCSerialPort\Debug\MFCSerialPort.pdb (Partial PDB)
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========