前言
最近需要对 RDP 进行裁剪,首先就需要搭建 RDP 的编译环境,于是就使用了Git Hub上的 FreeRDP 开源项目,在实际的编译源码的过程中,遇到了非常多的问题,故在这里记录一下这一过程。
系统环境介绍
-
我在 Ubuntu 18.0.4 和 CentOS 8 上都完成了这一环境搭建,这里以 Ubuntu 18.0.4 为例。我们首先需要确保我们的 Ubuntu 是可以联网的,因为在后面的编译过程中需要用到非常多的依赖库,如果离线安装的话会非常麻烦且不一定能安装成功。
-
同时预先安装一下 gmake ,Ubuntu 系统上已经取消了 gmake,使用 make 来代替,所以我们只需要对 make 进行软链接就可以了,具体命令如下:
cd /usr/bin
sudo ln -s make gmake
具体步骤
-
进入到 /usr/local 目录下,执行下述命令下载 FreeRDP 开源项目,命令如下
git clone git://github.com/FreeRDP/FreeRDP.git
如果出现下载失败的情况,则根据出错原因在网络上都可以查找出相关的解决方案。 -
接下来就需要安装依赖库了,在FreeRDP上给出了我们需要安装的依赖库,但是其中有一些库是已经过期了的,我整理了一下,如下所示:
sudo apt-get install ninja-build build-essential git-core debhelper cdbs dpkg-dev autotools-dev cmake pkg-config xmlto libssl-dev docbook-xsl xsltproc libxkbfile-dev libx11-dev libwayland-dev libxrandr-dev libxi-dev libxrender-dev libxext-dev libxinerama-dev libxfixes-dev libxcursor-dev libxv-dev libxdamage-dev libxtst-dev libcups2-dev libpcsclite-dev libasound2-dev libpulse-dev libjpeg-dev libgsm1-dev libusb-1.0-0-dev libudev-dev libdbus-glib-1-dev uuid-dev libxml2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libfaad-dev libfaac-dev libcunit1-dev libdirectfb-dev xmlto doxygen libxtst-dev
-
若下载过程中出现问题,大部分原因都是 url 不稳定导致的,网络有相关的解决方案。当依赖库安装完成后,进入到 FreeRDP 项目下,执行 cmake 命令,若期间没有报错则继续执行 make,make install 命令:
cd FreeRDP
sudo cmake .
sudo make
sudo make install
此时就会在 usr/local/bin 目录下生成 xfreerdp 可执行文件,这时生成的 xfreerdp 是一个功能非常完善的程序,但是其中的一些功能我并不需要,为了精简,需要对其进行裁剪。 -
进入到 client/Sample 目录下,执行 cmake 命令生成 Makefile :
cd client/Sample
sudo cmake .
报了如下错误:
https://www.jianshu.com/p/f9f20fc91c86 解决了这个问题。 -
成功生成 Makefile 时,依次执行:
sudo make
sudo make install
当执行sudo make
时,出现了如下错误:
这是没有找到 winpr 这个目录导致的,这个目录在 /usr/local/include 目录下,执行命令:cd /usr/local/include
,会看到下面两个文件夹:
我们需要的是 winpr 并不是 winpr3,注意 winpr3 并不是 winpr,所以不能用改名字的方法来解决,winpr在哪里呢?就在 winpr3 目录下,我们只需要将其拷贝到 include 下就可以了,具体操作如下图所示:
然后再进入到刚开始的 Sample 目录下,执行 make 命令,
又报了这样的错误,错误原因和上个问题一样,不知道在 include 目录下你看到 freerdp3 这个目录下没有呢。 -
再次执行 make 命令,又出现了如下错误
cannot find -lfreerdp-client,找到不 libfreerdp.so 这个库文件(去掉 l 加上 lib,末尾加上 .so 就是本身库的名字,在 usr/local/lib 目录下有一个libfreerdp3.so 文件,
我们将其拷贝一下并命名为 libfreerdp.so ,命令如下:
sudo cp libfreerdp3.so libfreerdp.so
同时也把 libfreerdp-client3.so 拷贝并命名一下,命令如下:
sudo cp libfreerdp-client3.so libfreerdp-client.so
再次回到 Sample 目录下,执行 make 命令,会报如下错误:
提示找不到 libwinpr3.so.3 这个库,但是在 usr/local/lib 这个目录下是有这个库文件的,说明链接时并没有找到这个库文件,当时也琢磨了很长时间,最后仔细看了 CMakeList.txt 文件的内容终于找到了解决方案(注意不要去看 Makefile,因为 Makefile 是用 cmake 生成的,cmake 是根据 CMakeList.txt 文件完成编译的),解决方法如下:(1) vi 打开 CMakeList.txt 文件
(2) 找到下图的位置
把 winpr3 加上去,最后如下图所示:
保存并退出。 -
再次执行
sudo make
命令,会发现可以生成最终的可执行文件了:
此时 FreeRDP 的编译环境就完全搭建完成了,CentOS 8 的搭建步骤与此类似,以供参考。