由于公司安排做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,打印帮助信息,表示安装正确。