undefined reference to CException....

mm36995225 2013-08-02 10:43:44
一个程序模块,五个文件夹。base、param、proc编译都正确,而且生成的库放在了lib。编译app下的文件报错。错误是proc文件夹下的DbInterface.cpp undefined reference to CException::CException(char*,int,char const*,...). CException.cpp在param文件夹下。DbInterface.h已经包含了CException.h。是哪里问题?如何解决?
...全文
206 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-08-04
  • 打赏
  • 举报
回复
建议贴出头文件.
lm_whales 2013-08-04
  • 打赏
  • 举报
回复
另外漏写分号,右括号,也会有类型未定义错误.
lm_whales 2013-08-04
  • 打赏
  • 举报
回复
CException?? 别告诉我,你用的是Vc ,并且还用了MFC; MFC类库就有CException,你又定义一个,会产生命名冲突,编译器当然不给你用CException 了. 名字冲突,CException有歧义,所以就是未定义的. 其他类库,编译器不知有没有,叫CException的类,不能确定,是什么问题. 当然,如果出现类的循环引用(两个类的头文件互相包含),也会出现,类型未定义错误.
todd_leftcode 2013-08-04
  • 打赏
  • 举报
回复
理论上像上CException.cpp不在你的那几个lib中, 看看有没有把它包含在工程里或Makefile里
赵4老师 2013-08-02
  • 打赏
  • 举报
回复
偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。” 的方法解决的。
zhctj159 2013-08-02
  • 打赏
  • 举报
回复
你给的信息少、、有图有真相,,,
max_min_ 2013-08-02
  • 打赏
  • 举报
回复
引用 5 楼 mm36995225 的回复:
感觉应该不是代码的问题。Makefile?哎。不知道。请高手指导

注意makefile里的库的调用顺序,如果你定义了话,
估计就是顺序问题了
赵4老师 2013-08-02
  • 打赏
  • 举报
回复
VC6: 工程、设置、C/C++、分类:Preprocessor、附加包含路径:填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类:Input、附加库路径:填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类:Input、对象/库模块:填写附加依赖库的名字.lib 空格间隔多项 VS20xx: 项目、属性、C/C++、附加包含目录:填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录:填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项:填写附加依赖库的名字.lib 空格或分号间隔多项
zhctj159 2013-08-02
  • 打赏
  • 举报
回复
链接的时候是没有链接CException模块吗?你准备用的是放在lib下的CException库文件还是proc下的CException.o文件?,,如果没有指定使用库或者库文件的路径不对,而又没有在链接的命令行指定CException.o就会出现你的错误。
zcm_xh2008 2013-08-02
  • 打赏
  • 举报
回复
检查一下头文件里面这个构造函数的参数是否和这个实现里面的参数一致。。。如果一致,我就不知道是怎么回事了。。。坐等高手了。。。小生是学得不久的菜鸟。。。
引用 7 楼 mm36995225 的回复:
[quote=引用 6 楼 zcm_xh2008 的回复:] 应该是你这个函数只有声明和调用,而没有实现。。。你看看呢。。。
实现了啊。CException.cpp里面就是函数的实现呀。 #include "CException.h" CException::CException() {} CException::~CException() {} CException::CException( char * errstr) { m_msg.push_back(CExceptionMsg(0,"__FILE__",errstr)); } CException::CException(char * filename, int linenum , const char * format ,...) { char *ls_str = new char[1024 * 10]; va_list pvar; va_start (pvar, format); vsprintf(ls_str,format,pvar); va_end(pvar); CExceptionMsg e(linenum,filename,ls_str); m_msg.push_back(e); delete[] ls_str; } void CException::toString() { vector<CExceptionMsg>::iterator it; for ( it = m_msg.begin(); it != m_msg.end(); it++) printf("File[%12s:%4d] Msg[ %s ]\n",it->m_filename,it->m_linenum,it->m_msg); } void CException::Push(CExceptionMsg msg) { m_msg.push_back(msg); } char* CException::GetString() { vector<CExceptionMsg>::iterator it; char *pstr = new char[1024]; int curpos = 0; int leftsize = sizeof(m_errstr) -1; int length = 0; for ( it = m_msg.begin(); it != m_msg.end(); it++) { sprintf(pstr,"File[%12s:%4d] Msg[ %s ]\n",it->m_filename,it->m_linenum,it->m_msg); length = strlen(pstr); leftsize -= length; if (leftsize < 0) break; strcpy(&m_errstr[curpos], pstr); curpos += length; } delete [] pstr;// return m_errstr; } CExceptionMsg::CExceptionMsg(char * filename, int linenum , char * format, ...) { strcpy(m_filename,filename); m_linenum = linenum; char *msg = new char[1024*2]; va_list pvar; va_start (pvar,format); vsprintf(msg,format,pvar); va_end (pvar); strncpy(m_msg,msg,sizeof(m_msg)-20); if (strlen(msg) > sizeof(m_msg)-20) { strcat(m_msg,"[[msg超长]]"); } delete [] msg; }[/quote]
mm36995225 2013-08-02
  • 打赏
  • 举报
回复
引用 6 楼 zcm_xh2008 的回复:
应该是你这个函数只有声明和调用,而没有实现。。。你看看呢。。。
实现了啊。CException.cpp里面就是函数的实现呀。 #include "CException.h" CException::CException() {} CException::~CException() {} CException::CException( char * errstr) { m_msg.push_back(CExceptionMsg(0,"__FILE__",errstr)); } CException::CException(char * filename, int linenum , const char * format ,...) { char *ls_str = new char[1024 * 10]; va_list pvar; va_start (pvar, format); vsprintf(ls_str,format,pvar); va_end(pvar); CExceptionMsg e(linenum,filename,ls_str); m_msg.push_back(e); delete[] ls_str; } void CException::toString() { vector<CExceptionMsg>::iterator it; for ( it = m_msg.begin(); it != m_msg.end(); it++) printf("File[%12s:%4d] Msg[ %s ]\n",it->m_filename,it->m_linenum,it->m_msg); } void CException::Push(CExceptionMsg msg) { m_msg.push_back(msg); } char* CException::GetString() { vector<CExceptionMsg>::iterator it; char *pstr = new char[1024]; int curpos = 0; int leftsize = sizeof(m_errstr) -1; int length = 0; for ( it = m_msg.begin(); it != m_msg.end(); it++) { sprintf(pstr,"File[%12s:%4d] Msg[ %s ]\n",it->m_filename,it->m_linenum,it->m_msg); length = strlen(pstr); leftsize -= length; if (leftsize < 0) break; strcpy(&m_errstr[curpos], pstr); curpos += length; } delete [] pstr;// return m_errstr; } CExceptionMsg::CExceptionMsg(char * filename, int linenum , char * format, ...) { strcpy(m_filename,filename); m_linenum = linenum; char *msg = new char[1024*2]; va_list pvar; va_start (pvar,format); vsprintf(msg,format,pvar); va_end (pvar); strncpy(m_msg,msg,sizeof(m_msg)-20); if (strlen(msg) > sizeof(m_msg)-20) { strcat(m_msg,"[[msg超长]]"); } delete [] msg; }
zcm_xh2008 2013-08-02
  • 打赏
  • 举报
回复
应该是你这个函数只有声明和调用,而没有实现。。。你看看呢。。。
mm36995225 2013-08-02
  • 打赏
  • 举报
回复
感觉应该不是代码的问题。Makefile?哎。不知道。请高手指导
mm36995225 2013-08-02
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。” 的方法解决的。
恩,你的方法可以尝试。但是文件太多。哎。试试吧。谢谢
mm36995225 2013-08-02
  • 打赏
  • 举报
回复
引用 1 楼 zhctj159 的回复:
你给的信息少、、有图有真相,,,
就是这个问题。

65,187

社区成员

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

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