1、文件在windows下编译,运行都正常,但是在linux下就出编译错误,说一个宏没定义,还有open,close等几个操作文件的函数不认识。初步判断是宏设置编译选项的问题。于是先查open函数,发现在windows下是需要#include <fcntl.h> 这一句的。然后在全项目范围内找fcntl.h文件,发现在文件中是这样定义的:
#ifdef HAVE_FCNTL_H | <script type=text/javascript> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </script> |
然后用相同的方式又找到了几个要定义的宏,在文件中加上定义,再编就通过了。
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);