由于公司安排做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,列印幫助資訊,表示安裝正确。