curl,libssh2,openssl,zlib的编译

前年,客户要求ATM客户端程序添加sftp功能,领导发给我4个静态库,分别是libcurl.lib,libeay32.lib,ssleay32.lib,libssh2.lib。
使用这4个库成功实现了sftp功能。当时从网络上查到该四个静态库均可以用开源代码编译生成。
前段时间工作不忙,想起了这件事,打算从网上下载源代码,自己动手编译这些源代码生成这4个库。一开始根本不知道如何下手,
找baidu帮忙吧。按照网上的做法开始编译这些源代码,但是编译过程中遇到各种问题,每次遇到问题就baidu解决方法,如果没有找到解决办法就
查看源代码包中的说明文档。这些说明文档全是英文的,这时候就体现出学英语的意义来了。在编译这些像天书一样的源代码的过程中,深深感受到
这些源代码的作者的智慧、毅力和无私的美德,向这些精英致敬!废话说完了,切入正题。
1.openssl的编译(release模式)
1.1下载openssl源代码
baidu一下openssl,很容易就能找到openssl的官网,我下的版本是openssl-0.9.8g
1.2安装ActivePerl
下载ActivePerl并安装,编译openssl时要用到
1.3编译openssl源代码
首先我强烈推荐你阅读一下根目录下的INSTALL.W32文件,该文件详细介绍了如何编译openssl。我总结了一下该文档的要点,在下面列出来。
a.打开命令提示符,进入openssl根目录,执行perl Configure VC-WIN32 --prefix=c:/some/openssl/dir
需要注意的是/不要修改成\,否则可能在编译openssl过程中遇到麻烦。
b.执行ms\do_ms
c.执行C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
d.如果你想得到动态库请执行nmake -f ms\ntdll.mak
如果你想得到静态库请执行nmake -f ms\nt.mak
用上述方法得到的动态库或静态库是release模式的,如果你想得到debug模式请阅读一下根目录下的INSTALL.W32文件。
2.zlib的编译
2.1下载zlib源代码
我下的版本是zlib-1.2.11
2.2编译zlib
a.打开命令提示符,执行C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
b.进入zlib根目录\win32,执行nmake -f win32/Makefile.msc
3.libssh2的编译
3.1下载libssh2源代码
我下的版本是libssh2-0.16
3.2编译libssh2
在libssh2-0.16\win32目录下我看到了熟悉的.dsw文件,这下终于可以不用nmake命令来编译了,双击libssh2.dsw打开它吧,
出乎意料的是它不是一个正常的工作区文件,visual c++ 6.0没有打开有效的工程文件。费了好长时间终于搞明白了,原来
这里的.dsw文件和.dsp文件中的换行符均是linux下的换行符,visual c++ 6.0不能识别这些换行符。原因找到了,问题就好解决了。
我用beyond compare(一款代码对比软件)将libssh2-0.16\win32目录下所有的.dsw和.dsp文件都另存为了windows下的换行符,
visual c++ 6.0可以成功打开工作区文件并成功加载工程文件了。
接下来将openssl根目录\include下的openssl文件夹复制到libssh2根目录\win32目录下,
将编译openssl生成的库文件libeay32.lib和ssleay32.lib复制到libssh2根目录\win32目录下,
将zlib根目录下所有的.h头文件复制到libssh2根目录\win32目录下,
将编译zlib生成的zlib.lib复制到libssh2根目录\win32目录下。
接下来点击visual c++的Build菜单,Rebuild All子菜单,编译过程中会报错error C2065: 'socklen_t' : undeclared identifier,
这就是开源代码的缺点,无法保证代码的完全正确。baidu了一下,找到解决该错误的方法。
在session.c文件中添加socklen_t的定义如下:
#if defined(_MSC_VER) && (_MSC_VER == 1200)
typedef int socklen_t;
#endif

你可以根据自己的需要选择生成静态库还是动态库,debug模式还是release模式。
如果你选择生成静态库,你会在之后的测试中发现一个很诡异,很致命的问题,应用程序无法链接静态库中的函数。
经过很长时间的测试和分析,终于找到了原因。请看头文件libssh2.h中定义宏的一段代码。
/* Allow alternate API prefix from CFLAGS or calling app */
#ifndef LIBSSH2_API
# ifdef LIBSSH2_WIN32
#  ifdef LIBSSH2_LIBRARY
#   define LIBSSH2_API __declspec(dllexport)
#  else
#   define LIBSSH2_API __declspec(dllimport)
#  endif /* LIBSSH2_LIBRARY */
# else /* !LIBSSH2_WIN32 */
#  define LIBSSH2_API
# endif /* LIBSSH2_WIN32 */
#endif /* LIBSSH2_API */
当你选择生成静态库时,宏LIBSSH2_API的值为__declspec(dllexport),事实上这种情况下LIBSSH2_API的值应该为空。
我对这段代码做了最简单的修改如下。
/* Allow alternate API prefix from CFLAGS or calling app */
#ifndef LIBSSH2_API
# ifdef LIBSSH2_WIN32
#  ifdef LIBSSH2_LIBRARY
#   define LIBSSH2_API //__declspec(dllexport)
#  else
#   define LIBSSH2_API //__declspec(dllimport)
#  endif /* LIBSSH2_LIBRARY */
# else /* !LIBSSH2_WIN32 */
#  define LIBSSH2_API
# endif /* LIBSSH2_WIN32 */
#endif /* LIBSSH2_API */
经过测试,问题是解决了,但是修改后的这段代码是无法兼容生成动态库这种情况的,所以如果你想生成动态库,
这段代码是不需要修改的。
Rebuild All就完成了libssh2的编译。
4编译curl
4.1下载curl
我下载的是curl-7.32.0
4.2编译curl
编译之前建议你好好看一下curl根目录\winbuild目录下的BUILD.WINDOWS.txt,我总结出编译curl的主要步骤如下:
a.在curl根目录的上一级目录新建文件夹命名为deps,在deps文件夹下新建三个文件夹,分别命名为include,lib和bin。
将openssl根目录\include下的openssl文件夹复制到include文件夹下,将libssh2根目录\include文件夹下的文件复制到
include文件夹下,将zlib根目录下所有的.h头文件复制到include文件夹下,将openssl根目录\out32目录下的libeay32.lib和ssleay32.lib
复制到lib文件夹。如果nmake时设置WITH_ZLIB=static,请将zlib根目录下的zlib.lib复制到lib文件夹,并将zlib.lib重命名为zlib_a.lib,如果
nmake时设置WITH_ZLIB=dll,我没有测试过这种情况,请自行处理。如果nmake时设置WITH_SSH2=static,请将libssh2根目录\win32\Release_lib
目录下的libssh2.lib复制到lib文件夹,并重命名为libssh2_a.lib,如果nmake时设置WITH_SSH2=dll,我没有测试过这种情况,请自行处理。
b.在curl根目录\lib\config-win32.h文件中增加代码如下
#ifndef ALLOW_MSVC6_WITHOUT_PSDK
#define ALLOW_MSVC6_WITHOUT_PSDK
#endif
在curl根目录\lib\md5.c文件中增加代码如下
#ifndef   _WIN32_WINNT 
#define   _WIN32_WINNT   0x0400 
#endif
将curl根目录\lib\socks_sspi.c文件中所有的FreeCredentialsHandle修改为FreeCredentialHandle

b.启动命令提示符,执行C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat
c.在命令提示符中进入curl根目录\winbuild,执行nmake /f Makefile.vc mode=static VC=6 WITH_SSL=static WITH_ZLIB=static WITH_SSH2=static ENABLE_SSPI=no ENABLE_IPV6=no ENABLE_IDN=no ENABLE_WINSSL=no DEBUG=no MACHINE=x86
上面的nmake命令可以根据你的需要进行修改。
到此,curl的编译全部完成了,curl根目录\builds\libcurl-vc6-x86-debug-static-ssl-static-zlib-static-ssh2-static-spnego\bin
目录下有一个curl.exe,可以用来测试生成的静态库或动态库是否可用。
 

你可能感兴趣的:(vc,开源代码,curl,libssh2,openssl,zlib)