分类: C/C++
2010-08-15 03:55:07
a)运行>vcvars32.batb)cd命令进入入openssl的目录下面
c)运行>perl Configure VC-WIN32d)运行>ms\do_masme)运行>nmake -f ms\ntdll.mak(动态库编译)编译时在app\s_cb.c的733行等4处出现struct in6_addr未定义错误,查了一下,ws2tcpip.h中定义的是struct in_addr6 和 IN6_ADDR,所以加入define in6_addr in_addr6解决。f)运行>nmake -f ms\nt.mak(静态库编译)g)去out32dll拷贝出动态库,out32dll拷贝出静态库,复制出Openssl目录下的inc32目录就全了。
c)V1.0在src/data_types/connect.c中用到EINPROGRESS宏定义,在win32中是WSAEINPROGRESS,改一下即可。在src/data_types/mailstream_ssl.c->ssl_data_close()中,使用socket_data变量明显错误,改为ssl_data。源码V0.52以后没有src/data_types/cinthash.cpp和src/windows/wsocket.cpp,从工程中去掉。在src/low-level/imap/quota*.c几个文件没有加上,需要加上,否则出现连接时找不到变量和函数。
1、修改工程设置中的“输出路径”,原来项目中定义的“$(ConfigurationName)”支持不好。2、工程选项中去掉转换过来时带的PRECOMP_VC7_TOBEREMOVE参数,乱来奇怪。3、在windows/libetpan-config.h中加入typedef unsigned short UINT16的定义,VC6中没定义这个。会出现有关uint16_t的错误。4、在windows/inet_aton.c中有与ULONG_PTR类型相关的错误,改改代码,直接用unsigned long代替。5、libcrypto=libeay32,libssl=ssleay32。
该错误主要是由于静态库在VC6编译而主程序在VC2005编译,大家用的CRT不同。解决办法,代码中增加#ifdef __cplusplus
extern "C"
#endif
FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};此错误的产生根源:
在VC6的stdio.h之中有如下定义_CRTIMP extern FILE _iob[];
#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])stdin、stdout、stderr是通过查_iob数组得到的。所以,VC6编译的程序、静态库只要用到了printf、scanf之类的函数,都要链接_iob数组。而在vc2005中,stdio.h中变成了_CRTIMP FILE * __cdecl __iob_func(void);
#define stdin (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])_iob数组不再是显式的暴露出来了,需要调用__iob_func()函数获得。所以vc6的静态库链接VC2005的C运行库就会找不到_iob数组.
通过重新定义
FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};
就把vc6需要用到的_iob数组搞出来了
再待一下。。。