您的位置:首页 > 其它

调试中解决问题的经历

2007-10-24 15:34 260 查看
1、文件在windows下编译,运行都正常,但是在linux下就出编译错误,说一个宏没定义,还有open,close等几个操作文件的函数不认识。初步判断是宏设置编译选项的问题。于是先查open函数,发现在windows下是需要#include <fcntl.h> 这一句的。然后在全项目范围内找fcntl.h文件,发现在文件中是这样定义的:

#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
那么问题就聚集在HAVE_FCNTL_H宏上了。
然后用相同的方式又找到了几个要定义的宏,在文件中加上定义,再编就通过了。

2、原程序编译没有问题。全部删除又从服务器上重新下了遍。再编译就出了好几个LINK问题。

  CaObj.obj : error LNK2019: 无法解析的外部符号"public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall ZNmaInfo::GetInfo(enum NmaInfoFlag)" (?GetInfo@ZNmaInfo@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@W4NmaInfoFlag@@@Z),该符号在函数"private: int __thiscall ZCaObj::GetAddrhandler(unsigned char *)" (?GetAddrhandler@ZCaObj@@AAEHPAE@Z) 中被引用
  

  解决思路是先找ZNmaInfo::GetInfo的定义在哪里。结果在项目的一个公共文件夹里发现了NmaInfo.cpp和.h文件。将这两个文件包含进当前的项目,则此LINK问题顺利通过。

  LINK问题类型不少,但是,基本思路应该都是包含头文件、库文件之类没包含进去的问题。因为是链接阶段报的错,所以问题的主因是,找需要链接的东西没有找到。

3、程序中变量出现乱码。

 从数据库中读出的数据,然后做了copy之类的工作。copy前特意把此变量打出来,显示正常,但是copy后的新变量打出的数据就有乱码。最后发现是copy所使用的函数造成。将memcpy改为strcpy后,问题解决。

 strcpy是拷贝字符串,以/0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)
 strcpy的原型为
 char *strcpy(char *dest, const char *src)

 而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字符)
 memcpy的原型为
 void *memcpy(void *dest, const void *src, size_t n);
 

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: