一直都用gcc开发,好久没有用VC,前两天写代码的时候装了一大堆插件,visual Assist X,WndTabs,Spelly,Project Line Counter,SourceStyler C++,用的挺爽的,感觉比VI好用多了,但是一编译,噩梦就开始了。
语法错误到不多,很快就改好了。
接下来就遇到了一个错误
error C2065: 'TryEnterCriticalSection' : undeclared identifier
很奇怪,同时关键段的其他函数没有这样的问题,偏偏只有这个函数有,只好求助于google,发现需要添加一个宏定义,_WIN32_WINNT=0x500,意思应该就是只从某一版本的windows开始支持,好像是win2000,以前的就不需要支持了,这样就可以支持一些新的函数,我想这个TryEnterCriticalSection就应该是其中之一。
这个问题没有了,又出了新的问题,一下子跳出了很多error C2011。
就像这个一样 error C2011: 'fd_set' : 'struct' type redefinition,而且还有提示winsock.h和winsock2.h中的定义冲突macro redefinition。
开始以为这个问题就是重复定义,可以找了半天没有发现winsock2.h的影子,就很奇怪,查了网上的帖子也没有发现这样的情况,其他人虽然有相同的错误,但是大多都是使用了stdafx.h,里面的定义冲突了,记得以前写VC的时候,项目建造的时候可以选是否支持网络,但是这次我建的是一个空的windows console项目,没有使用,所以还是没办法。查了半天还是没有结果。突然一时好奇想看看_WIN32_WINNT=0x500这个宏会带来什么样的变化,于是我就查了一下这方面的资料,没想到在windows.h里发现这样一段代码
#if(_WIN32_WINNT >= 0x0400)
#include \
#include \
#else
#include \
#endif
哈哈,怪不得重复定义呢,把包含的头文件winsock.h改成了windows.h,问题解决了。
接下来又是
error C2065: '_beginthreadex' : undeclared identifier
error C2065: '_endthreadex' : undeclared identifier
奇怪,怎么会不支持多线程的呢,正好手头还有一个以前的项目里面也用到了这两个函数,对比了一下项目文件,发现有个选项是/MLd,原来的那个项目里是/MDd,我直接在项目文件里改过来,发现问题解决,后来在project Settings->C/C++->code generation->use run-time library里面发现了是否支持多线程的选择。
编译全通过了,没想到link还是除了问题,明明有个函数声明和定义都有了,但是link就是找不到,出现了几个error LNK2001: unresolved external symbol,而且也不知道该google什么关键字,看来一些可能产生error LNK2001的原因,没一个合适我,后来还是一个同时帮了我,原来是我用了一个以前自己写的文件,文件的扩展名一定是.c,而不是.cpp。一般C++编译器对.c文件使用C方式编译,对.cpp文件使用C++方式编译(编译器会自动定义__cplusplus)。而C++的I/O流只能在C++编译方式下工作。
有两个方法解决最简单的是改文件扩展名为.cpp。
或者在头文件里的函数声明部分加这样的东西
#ifdef __cplusplus
extern "C"{
#endif
函数申明
#ifdef __cplusplus
};
#endif
我用了第一个方法,又发现了setsockopt这个函数的小问题,原来是C++编译器对类型转化比C来的严格造成的。
终于程序可以跑了起来,看来VC虽然比GCC用起来方便,但是很多东西都掩藏在预处理和工具的设置上,改起来很不方便,像那个/MDd表示可以debug的多线程库,根本无法直接理解,不像用GCC的时候,全是在makefile中写清楚,就算不懂,但是很容易理解,改起来也比较方便。不过好在这些开发环境的问题不会太多,遇到过了以后就好了。
"
这个问题还是比较普遍,我的做法是在 windows.h 前先 winsock2.h
#include \
#include \
阅读(1796) | 评论(0) | 转发(0) |