天天看点

64位CentOS7下编译安装nsis-2.46

       由于公司安排做OpenVPN的二次开发,所以需要搭建开发环境。官网查看windows下的客户端软件,官方发布版是在Linux下通过交叉编译生成的安装可执行文件。nsis则是将Linux下编译生成的dll,exe文件进行打包然后生成一个可安装文件的工具。yum安装行不通,Google上也找不到rpm安装包。只找到相应的源码包。所以只好自己编译。

1. 下载 nsis-2.46-src.tar.bz2 (source) and nsis-2.46.zip (zip package)两个包。

2. 在/usr/local/下创建一个nsis文件夹,用于编译和安装。

    mv nsis-2.46-src.tar.bz2 /usr/local/nsis/ 

     mv nsis-2.46.zip /usr/local/nsis/

3. cd /usr/local/nsis

    tar -jxvf nsis-2.46-src.tar.bz2

    unzip nsis-2.46.zip 

4. 在解压后的nsis-2.46-src目录下,有一个INSTALL文件,提供一些编译方面的信息,可供参考。

     编译需要依赖的软件环境:

1. Python版本1.6及以上;

        2. SCons 版本0.96.93及以上

        3. C编译器

    针对自己Linux环境进行相应软件的安装即可。

5. 编译环境搭好后,即可开始编译。

    scons SKIPSTUBS=all SKIPPLUGINS=all SKIPUTILS=all SKIPMISC=all NSIS_CONFIG_CONST_DATA=no PREFIX=/usr/local/nsis/nsis-2.46    install-compiler

   编译的时候,可能报如下错误

   Source/script.cpp:6465:1:   required from here

Source/util.h:128:59: error: 'close' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]

   template <typename T> void operator()(T& x) { freefunc(x); } \

                                                           ^

Source/util.h:145:1: note: in expansion of macro 'RM_DEFINE_FREEFUNC'

 RM_DEFINE_FREEFUNC(close);

 ^

In file included from Source/script.cpp:49:0:

/usr/include/unistd.h:353:12: note: 'int close(int)' declared here, later in the translation unit

 extern int close (int __fd);

   错误原因是一个模板在实例化时宏展开一个函数,但这个函数没有事先声明,找不到原型。所以在script.cpp中,

   #include "util.h"前面添加如下代码:

   __BEGIN_DECLS

   extern int close (int __fd);

   __END_DECLS

6. nsis是32位版本的,需要32位版本的libstdc++库

    yum upgrade libstdc++

    yum install libstdc++.i686

    yum upgrade zlib

    yum install zlib.i686

7. 编译32位程序,编译器可能错误使用64位链接器。修改编译脚本,指定用32位ld

    vim   SCons/Config/gnu

    在### makensis environment下面相应位置追加环境变量

     makensis_env.Append(LINKFLAGS= ['-m32'])

8.将/usr/local/nsis/nsis-2.46/hin加入PATH环境变量。第一次执行出现以下错误:

   Error: opening stub "/usr/local/nsis/nsis-2.34/share/nsis/Stubs/zlib

   Error initalizing CEXEBuild: error setting default stub

   解决此问题:

    在/usr/local/nsis/nsis-2.46目录mkdir share,然后在share目录下执行ln -s /usr/local/nsis/nsis-2.46    nsis创建软链接。OK,大功告成。执行makensis,打印帮助信息,表示安装正确。

继续阅读