Username: Password:

编译stunnel-编译成插件或应用程式
来源: ChinaUnix博客  作者: ChinaUnix博客   发布时间:2007-01-01 09:26:00

1、编译成应用程式
首先下载Stunnel,
http://www.stunnel.org/download/stunnel/src/stunnel-4.05.tar.gz
,由于编译时需要openssl的支持,所以下载openssl,
http://www.openssl.org/source/openssl-0.9.7.tar.gz
,而编译openssl需要perl的支持,所以下载perl,
http://ftp.funet.fi/pub/CPAN/src/perl-5.8.5.tar.gz
。首先编译perl,没有什么难度。然后在openssl中指明perl的路径,编译,也成功了。然后修改stunnel/src/makefile.w32文档,指明openssl的路径,stunnel也能够成功编译了。由于我只有1台PC,测试起来比较麻烦,就没有测试,但是怎样使用看stunnel的帮助文档就能够了。

编译成插件
    注意:笔者试着下载了最新的包,但是里面包含sock_len的定义,而且4.20只是增加了手持设备的支持,所以笔者在4.20下没有编译通过,也觉得没有必要,最后选择了在4.05下编译,高手能够试试最新版。
    stunnel自己带的makefile是用gcc的,但是似乎和静态的openssl库链接时有问题。好在stunnel的程式员很照顾我,代码都是ANSI C,能够不出任何问题地用VC编译。先修改stunnel的gui.c,找到:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpszCmdLine, int nCmdShow) {
修改为:
extern __declspec( dllexport ) int stunnel()
{
    HINSTANCE hInstance;
    HINSTANCE hPrevInstance;
    LPSTR lpszCmdLine = "plugins\\stunnel\\stunnel.conf";
    int nCmdShow;
   
下面的win_main函数是创建窗体的,我们并无需,把win_main函数删掉大部分代码后改成这个样子:
static int win_main(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpszCmdLine, int nCmdShow) {
    DWORD iID;
    CloseHandle(CreateThread(NULL, 0, ThreadFunc, NULL, 0, &iID));
    return 0;
    }
最终形成了stunnel的vc工程,明天将上载上来供大家参考
然后把静态openssl库libeay32.lib和ssleay32.lib拷贝到src目录,用下面这些命令编译:
::-------------------------------------------------
cl -DUSE_WIN32 -DHAVE_OPENSSL -c stunnel.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c ssl.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c client.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c protocol.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c sthreads.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c log.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c options.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c sselect.c
cl -DUSE_WIN32 -DHAVE_OPENSSL -c gui.c
rc resources.rc
link -out:stunnel.dll /DLL ws2_32.lib gdi32.lib user32.lib shell32.lib comdlg32.lib libeay32.lib ssleay32.lib stunnel.obj ssl.obj client.obj protocol.obj sthreads.obj log.obj options.obj sselect.obj gui.obj resources.res
::-------------------------------------------------
   
调用过程如下
得到stunnel.dll和stunnel.lib。stunnel.dll导出一个int stunnel()函数。
调用过程   
    static char dllname[] = "plugins\\stunnel\\stunnel.dll";
    static char funcname[] = "stunnel";
    static HMODULE hStunnel;
    static FARPROC stunnel;
    hStunnel = LoadLibraryA( dllname );
    if ( hStunnel==NULL )
    {
         MessageBox
         ( 0,
           "Load stunnel.dll failed.",
           "BkSSL",
           MB_ICONERROR
         );
         return 1;
    }
   
    stunnel = GetProcAddress( hStunnel, funcname );
    stunnel();
将stunnel.dll和stunnel.conf、stunnel.pem都放进去即可。
将我编译成功的stunnel封装共享给大家(含源码和配置)
http://blogimg.chinaunix.net/blog/upfile/071018112912.rar


本文来自ChinaUnix博客,假如查看原文请点:http://blog.chinaunix.net/u1/49674/showart_399063.html

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅