網上的文章坑太多,這里做個記錄。
編譯openssl需要先安裝Perl,比較簡單這里略去。
openssl的下載要注意使用release的版本,而不是master,主要是ms目錄里要有do_*.bat等一堆文件,我下的master里沒有這些文件,以致走了許多彎路。
打開vs的工具命令提示控制台最好使用以管理員身份運行。
在openssl源代碼目錄環境下編譯openssl
1、cd E:\opensource\openssl
2、perl Configure VC-WIN32 no-asm
必須指定no-asm,不然后邊很多編譯會報錯,如果指定--prefix=E:\openssl則會安裝到相應的目錄。
3、ms\do_nasm.bat
ms子目錄下生成nt.make和ntdll.make文件,由於指定了no-asm,所以在這里必須是do_nasm而不是do_ms,有說是perl Configure VC-WIN32生成do_等文件,純屬瞎掰,生成的是makefile文件。
4、nmake -f ms\nt.mak
在out32目錄下生成靜態庫
5、nmake -f ms\ntdll.mak (可選)
在out32dll目錄下生成動態庫,這條可選,因為cmake后邊的freerdp只需要靜態庫,兩個都生成一下用於編寫OpenSSL程序。這里簡單記錄一下:
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
將動態鏈接庫ssleay32.dll, libeay32.dll復制到C:\WINDOWS\system32或Debug目錄下,確保動態鏈接庫在正確的路徑。
6、nmake -f ms\nt.mak test (可選,用於測試,就不多說了)
7、nmake -f ms\nt.mak install
默認目錄在當前盤符的\usr\local\ssl路徑下。這一步驟不可少,否則安裝freerdp的時候會報找不到openssl的錯誤,這點我在后邊再敘述。
8、cd E:\opensource\freerdp
切換到freerdp的解壓目錄
9、cmake . -DOPENSSL_ROOT_DIR=E:\usr\local\ssl -DOPENSSL_LIBRARIES=E:\usr\local\ssl\lib -DOPENSSL_INCLUDE_DIR=E:\usr\local\ssl\include
至此,如果不報錯,會在freerdp的目錄中生成vs的工程文件。
我在這里浪費了不少時間,常見的錯誤是:
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES)
一直覺得是環境變量和系統路徑沒設置好的問題。更坑的是github上libssh的issues竟然說OPENSSL_LIBRARIES指向的應該是文件而不是路徑,然后各種的嘗試和搜索都沒有解決問題。其實cmake與環境變量和系統路徑關系不大,運行時指定即可。問題慢慢聚焦在openssl上,嘗試下載直接安裝了cmake仍然報錯,猜測可能缺少openssl-dev,然而linux可以直接apt-get install或yum install,而windows的chocolately卻不行,或是我沒找到,總之還得從openssl的源代碼編譯。由於這方面不熟悉,當初在沒有找到ms子目錄下do_*.bat等文件的情況下,直接nmake了makefile文件,然后又直接nmake install了。生成結果也有了,但隱藏的問題是生成的僅僅是運行時所需的文件,而freerdp的編譯需要openssl的開發版本。這也是報的那個錯老說找不到OPENSSL_LIBRARIES的原因。至此,離真相越來越近了,盡管之后的過程中又遇到不少坑,但畢竟方向對了,最終也就搞定了。
