error LNK2019: 无法解析的外部符号

jinling4388 2009-06-03 02:39:03
在我的工程中包含了其他的工程的文件。格式如下:
#include "..\SpeechManager.h"

……
{
……
CSpeakItem* item = new CSpeakItem(mesHis);
CSpeechManager::AddEventSpeech(SPP_NORMAL, 0, item);
}

错误:
1>正在链接...
1> 正在创建库 ..\ssnmate\Debug\QQDLL.lib 和对象 ..\ssnmate\Debug\QQDLL.exp
1>QQDLL.obj : error LNK2019: 无法解析的外部符号 "public: static int __cdecl CSpeechManager::AddEventSpeech(enum SPEAK_PRIORITY,unsigned long,class CSpeakItem *,class CSpeakItem *,class CSpeakItem *)" (?AddEventSpeech@CSpeechManager@@SAHW4SPEAK_PRIORITY@@KPAVCSpeakItem@@11@Z),该符号在函数 "long __stdcall HookProc(int,unsigned int,long)" (?HookProc@@YGJHIJ@Z) 中被引用
1>QQDLL.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall CSpeakItem::CSpeakItem(char const *,int,struct TTS_PARAM *)" (??0CSpeakItem@@QAE@PBDHPAUTTS_PARAM@@@Z),该符号在函数 "long __stdcall HookProc(int,unsigned int,long)" (?HookProc@@YGJHIJ@Z) 中被引用
1>..\ssnmate\Debug\QQDLL.dll : fatal error LNK1120: 2 个无法解析的外部命令

如果头文件换成#include "..\SpeechManager.cpp"

错误如下:
1> 正在创建库 ..\ssnmate\Debug\QQDLL.lib 和对象 ..\ssnmate\Debug\QQDLL.exp
1>QQDLL.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall ISpeechLog::ISpeechLog(void)" (??0ISpeechLog@@QAE@XZ),该符号在函数 "public: class ISpeech * __thiscall CSpeechManager::GetDefaultSpeech(void)" (?GetDefaultSpeech@CSpeechManager@@QAEPAVISpeech@@XZ) 中被引用
1>QQDLL.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall ISpeechIntersound::ISpeechIntersound(void)" (??0ISpeechIntersound@@QAE@XZ),该符号在函数 "public: class ISpeech * __thiscall CSpeechManager::GetDefaultSpeech(void)" (?GetDefaultSpeech@CSpeechManager@@QAEPAVISpeech@@XZ) 中被引用
1>QQDLL.obj : error LNK2019: 无法解析的外部符号 "void __cdecl DebugMsg(char const *,...)" (?DebugMsg@@YAXPBDZZ),该符号在函数 "public: static unsigned long __stdcall CSpeechManager::ReadingLoopThread(void *)" (?ReadingLoopThread@CSpeechManager@@SGKPAX@Z) 中被引用
1>..\ssnmate\Debug\QQDLL.dll : fatal error LNK1120: 3 个无法解析的外部命令


这是怎么回事呀?怎么解决呀?
...全文
150904 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ke081029 2012-08-11
  • 打赏
  • 举报
回复
同上。
言無 2012-06-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

解决了,竟然是因为我传递的参数不合理造成的
[/Quote]
楼主能否说下具体怎么解决的?
zhuawei111 2012-01-10
  • 打赏
  • 举报
回复
Users.cpp
// Users.cpp: implementation of the CUsers class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "kuncunxinxiguanl.h"
#include "Client.h"
#include "Users.h"
#include "ADOConn.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#if !defined(AFX_CLIENT_H__C210C883_216F_4A4E_BB2F_F034570AA92F__INCLUDED_)
#define AFX_CLIENT_H__C210C883_216F_4A4E_BB2F_F034570AA92F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CUsers::CUsers()
{
UserName = "";
Pwd = "";
User_type = 0;
}

CUsers::~CUsers()
{

}

CString CUsers::GetUserName()
{
return UserName;
}

void CUsers::SetUserName(CString cUserName)
{
UserName = cUserName;
}

CString CUsers::GetPwd()
{
return Pwd;
}

void CUsers::SetPwd(CString cPwd)
{
Pwd = cPwd;
}

int CUsers::GetUser_type()
{
return User_type;
}

void CUsers::SetUser_type(int iUser_type)
{
User_type = iUser_type;
}

//数据库操作
int CUsers::HaveName(CString cUserName)
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
//设置SELECT语句
_bstr_t vSQL;
vSQL = "SELECT * FROM Users WHERE UserName='" + cUserName + "'";

//执行SELECT语句
_RecordsetPtr m_pRecordset;
m_pRecordset = m_AdoConn.GetRecordSet(vSQL);
if (m_pRecordset->adoEOF)
return -1;
else
return 1;

//断开与数据库的连接
m_AdoConn.ExitConnect();
}


void CUsers::sql_insert()
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
//设置INSERT语句
CString strType;
strType.Format("%d", User_type);

_bstr_t vSQL;
vSQL = "INSERT INTO Users VALUES('" + UserName + "','" + Pwd + "',"
+ strType + ")";
//执行INSERT语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();
}

void CUsers::sql_updatePwd(CString cUserName)
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
//设置UPDATE语句
CString strType;
strType.Format("%d", User_type);

_bstr_t vSQL;
vSQL = "UPDATE Users SET Pwd='" + Pwd + "' WHERE UserName='" + cUserName + "'";
//执行UPDATE语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();
}

void CUsers::sql_delete(CString cUserName)
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
//设置DELETE语句
_bstr_t vSQL;
vSQL = "DELETE FROM Users WHERE UserName='" + cUserName + "'";
//执行DELETE语句
m_AdoConn.ExecuteSQL(vSQL);
//断开与数据库的连接
m_AdoConn.ExitConnect();
}

//根据员工编号读取所有字段值
void CUsers::GetData(CString cUserName)
{
//连接数据库
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
//设置SELECT语句
_bstr_t vSQL;
vSQL = "SELECT * FROM Users WHERE UserName='" + cUserName + "'";
//执行SELETE语句
_RecordsetPtr m_pRecordset;
m_pRecordset = m_AdoConn.GetRecordSet(vSQL);

//返回各列的值
if (m_pRecordset->adoEOF)
CUsers();
else
{
UserName = cUserName;
Pwd = (LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("Pwd");
User_type = atoi((LPCTSTR)(_bstr_t)m_pRecordset->GetCollect("User_type"));
}
//断开与数据库的连接
m_AdoConn.ExitConnect();
}
#endif
Global.h
#pragma once
#include "Users.h"

class CGlobal
{
public:
//CUsers curUser;
CGlobal(void);
~CGlobal(void);
};

错误:1>Global.obj : error LNK2001: 无法解析的外部符号 "public: __thiscall CUsers::CUsers(void)" (??0CUsers@@QAE@XZ)
1>Global.obj : error LNK2001: 无法解析的外部符号 "public: virtual __thiscall CUsers::~CUsers(void)" (??1CUsers@@UAE@XZ)
1>E:\张华伟\vcgc\kuncunxinxiguanl\kuncunxinxiguanl\Debug\kuncunxinxiguanl.exe : fatal error LNK1120: 2 个无法解析的外部命令
1>
hong78 2011-11-30
  • 打赏
  • 举报
回复
同样的问题,还没有解决!!
sbtddh 2011-06-24
  • 打赏
  • 举报
回复
我也有同样的问题啊
jinling4388 2009-06-04
  • 打赏
  • 举报
回复
解决了,竟然是因为我传递的参数不合理造成的
mengde007 2009-06-03
  • 打赏
  • 举报
回复
把源码拿出来看看;
  • 打赏
  • 举报
回复
http://blog.csdn.net/friday5pm/archive/2007/03/08/1523859.aspx

碰到“error LNK2019: 无法解析的外部符号”收藏
有一个解决方案,有两个工程A,B。工程B中定义了一个类,在工程A的demo.cpp中引用该类,但是如果是

#include "XX,h",则会出现“error LNK2019: 无法解析的外部符号”

如果是#include "XX.cpp",则可以顺利编译通过。

想来是因为引用 .h 文件导致找不到.cpp中的定义,而引用.cpp可以通过.cpp找到.h(.cpp有对.h的include)

但是如果同在工程B下面,则#include "XX,h"也是正确的,它会自动关联到同名的(反正是对应的).cpp文件。

在不同工程中应该如何引用呢?

看见一种原因分析,如下:

现场情况:

funcname 在文件file.cpp/h中定义实现

void funcname(void) {;}

filecall.c文件内呼叫funcname()函数。

出现上面情况。

症因:因c/c++混合编程, c文件内函数无法呼叫c++文件内函数。

解决,或者将c文件名改为.cpp,或者将c++文件名改为.c

上面的解决采用将 file.cpp 更名为file.c即可。



amossavez 2009-06-03
  • 打赏
  • 举报
回复
有一个解决方案,有两个工程A,B。工程B中定义了一个类,在工程A的demo.cpp中引用该类,但是如果是

#include "XX,h",则会出现“error LNK2019: 无法解析的外部符号”

如果是#include "XX.cpp",则可以顺利编译通过。

想来是因为引用 .h 文件导致找不到.cpp中的定义,而引用.cpp可以通过.cpp找到.h(.cpp有对.h的include)

但是如果同在工程B下面,则#include "XX,h"也是正确的,它会自动关联到同名的(反正是对应的).cpp文件。

在不同工程中应该如何引用呢?

看见一种原因分析,如下:

现场情况:

funcname 在文件file.cpp/h中定义实现

void funcname(void) {;}

filecall.c文件内呼叫funcname()函数。

出现上面情况。

症因:因c/c++混合编程, c文件内函数无法呼叫c++文件内函数。

解决,或者将c文件名改为.cpp,或者将c++文件名改为.c

上面的解决采用将 file.cpp 更名为file.c即可。



来自CSDN博客:http://blog.csdn.net/friday5pm/archive/2007/03/08/1523859.aspx
老邓 2009-06-03
  • 打赏
  • 举报
回复
链接错误,你有需要的lib没有加入链接
sszwbuaa 2009-06-03
  • 打赏
  • 举报
回复
project-属性--link--输入--依赖库: 添加相应的库文件(可能是SpeechManager.lib)
lingyin55 2009-06-03
  • 打赏
  • 举报
回复
#include "..\SpeechManager.h"

#include "..\\SpeechManager.h"
或者
#include "../SpeechManager.h" 试试

w0911h 2009-06-03
  • 打赏
  • 举报
回复
这种情况一般都是函数只找到声明但没有实现,或者是少了什么链接库,你可以试试把那两个.h和.c文件直接加入工程中再试试

64,660

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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