windows 7 下编译 nopoll

Tags:

编译环境

  • windows 7 64位

  • VS 2013 Ultimate

  • openssl-1.0.2a

  • nopoll-0.2.8.b184

编译步骤

  1. nopoll官网提供了二进制安装包,不过不知为什么无法直接用(运行时错误,无法debug),所以还是得手动编译<
  2. nopoll依赖openssl,所以先编译openssl:

  3. 用编译好的openssl库来编译Nopoll

    nopoll虽然提供了Makefile.win,但我试了下,发现并不能一键编译,会提示缺少versions.mk和config.mk(这2个文件最后在nopoll的svn仓库里找到),补上这2个文件后再次执行nmake,会提示./prepare-nsh.sh permission denied(win平台执行sh文件?)

    按官方的编译方法失败后,只能自行建工程编译了:

    • 新建一个vs工程,取名libnopoll
    • 添加 nopoll-0.2.8.b184/src目录的源码文件到工程
    • 这里要改下nopoll_config.h(此文件应该是自动生成的,我们要手动修改一个出来)
 1       /*
 2       * Nopoll Library nopoll_config.h
 3       * Platform dependant definitions.
 4       *
 5       * This is a generated file.  Please modify 'configure.in'
 6       */
 7       #ifndef __NOPOLL_CONFIG_H__
 8       #define __NOPOLL_CONFIG_H__
 9       /**
10       * \addtogroup nopoll_decl_module
11       * @{
12       */
13       /**
14       * @brief Allows to convert integer value (including constant values)
15       * into a pointer representation.
16       *
17       * Use the oposite function to restore the value from a pointer to a
18       * integer: \ref PTR_TO_INT.
19       *
20       * @param integer The integer value to cast to pointer.
21       *
22       * @return A \ref noPollPtr reference.
23       */
24       #ifndef INT_TO_PTR
25       #define INT_TO_PTR(integer)   ((noPollPtr) (long) ((int)integer))
26       #endif
27       /**
28       * @brief Allows to convert a pointer reference (\ref noPollPtr),
29       * which stores an integer that was stored using \ref INT_TO_PTR.
30       *
31       * Use the oposite function to restore the pointer value stored in the
32       * integer value.
33       *
34       * @param ptr The pointer to cast to a integer value.
35       *
36       * @return A int value.
37       */
38       #ifndef PTR_TO_INT
39       #define PTR_TO_INT(ptr) ((int) (long) (ptr))
40       #endif
41       /**
42       * @brief Allows to get current platform configuration. This is used
43       * by Nopoll library but could be used by applications built on top of
44       * Nopoll to change its configuration based on the platform information.
45       */
46       //#define NOPOLL_OS_UNIX (1)
47       #define NOPOLL_OS_WIN32 (1)
48       #define R_OK 4
49       #define W_OK 2
50       /**
51       * @internal Allows to now if the platform support vasprintf
52       * function. Do not use this macro as it is supposed to be for
53       * internal use.
54       */
55       //#define NOPOLL_HAVE_VASPRINTF (1)
56       /**
57       * @brief Indicates that this platform have support for 64bits.
58       */
59       #define NOPOLL_64BIT_PLATFORM (1)
60       /* @} */
61       #endif
62       
- 配置编译环境

    ![1.png](/images/2015.4/2.png)

    ![1.png](/images/2015.4/3.png)

    - 添加openssl的include、nopoll的src到包含目录

    - 添加上一步生成的ssl/lib目录 到 库目录

    - 执行 生成项目,就得到了libnopoll.lib文件
  1. 测试libnopoll.lib是否可用:

    • 新建测试项目,一样是 1.png
    • 添加nopoll官方的example代码,https://dolphin.aspl.es/svn/publico/nopoll/trunk/test/nopoll-regression-listener.c
    • 复制 /test的pem、crt、key文件到工程目录里:

      1.png

    • 然后是附加依赖项:

      1.png

    • 之后就可以编译 运行了:

      1.png

      看样子是成功了。

    • 最后客户端的例子也试着编译下,工程配置和server的一样,咦!! 编译时出现各种error:

      1.png

      照着反馈做即可,在文件头添加一个define

1            #define _CRT_SECURE_NO_WARNINGS
2        
    ![1.png](/images/2015.4/9.png)

    unlink改成_unlink呗;

    VERSION可能是要自己定义,也定义一个,之后就顺利编译出来了。

    不过运行的时候又出现报错:

    ![1.png](/images/2015.4/10.png)

    问题就是windows下没有linux的diff工具,先把相关的几行代码屏蔽掉先把,再次编译运行:

    ![1.png](/images/2015.4/11.png)

    Nice,客户端和服务端协同工作了。

(未经授权禁止转载)
Written on April 7, 2015

博主将十分感谢对本文章的任意金额的打赏^_^