网上的文章坑太多,这里做个记录。
编译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的原因。至此,离真相越来越近了,尽管之后的过程中又遇到不少坑,但毕竟方向对了,最终也就搞定了。