一次性把依赖装齐
bash
sudo apt install -y \
build-essential git cmake ninja-build pkg-config \
libssl-dev libx11-dev libxext-dev libxinerama-dev \
libxcursor-dev libxdamage-dev libxv-dev libxkbfile-dev \
libasound2-dev libcups2-dev libpulse-dev libjpeg-dev \
libusb-1.0-0-dev libudev-dev libdbus-1-dev \
libwayland-dev libpam0g-dev libkrb5-dev libfuse3-dev \
libxkbcommon-dev wayland-protocols libwayland-dev
拉取 3.19.1 源码(也可换其他 3.x tag)
bash
git clone -b 3.19.1 https://github.com/FreeRDP/FreeRDP.git
cd FreeRDP
配置 + 编译
bash
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
-DWITH_CHANNELS=ON \
-DWITH_SERVER=ON \
-DWITH_X11=ON \
-DWITH_WAYLAND=ON \
..
make -j$(nproc)
sudo make install
sudo ldconfig # 让系统找到新 so
cmake时,如果提示还缺少依赖,使用sudo apt install -y 安装对应的依赖即可,然后重新cmake
验证
bash
xfreerdp --version
# 输出 3.19.1(或你选的 tag)
编译过程中的错误处理
执行make -j$(nproc)时,报 undefined reference to xf_use_rel_mouse错误,说明 编译器找到了声明,但链接器找不到定义 ------ 即某个源文件没有被编译进最终的可执行文件。
1、找到调用点(一般在 client/X11/xf_event.c)
bash
cd ..
grep -n "xf_use_rel_mouse" client/X11/xf_event.c
输出如下:
bash
491: if (xfc->xi_event || xfc->xi_rawevent || (xfc->common.mouse_grabbed && xf_use_rel_mouse(xfc)))
604: if (xfc->xi_event || xfc->xi_rawevent || (xfc->common.mouse_grabbed && xf_use_rel_mouse(xfc)))
617: if (xfc->xi_event || xfc->xi_rawevent || (xfc->common.mouse_grabbed && xf_use_rel_mouse(xfc)))
源码里 3 处直接调用 xf_use_rel_mouse() 作为逻辑判断,而 开关 -DWITH_X11_RELATIVE_MOUSE=OFF 只控制函数"是否编译",却没把调用点包起来,于是链接时找不到定义。
需要把 491、604、617 行的判断改成 宏包裹(让开关真正生效)
c
if (xfc->xi_event || xfc->xi_rawevent || (xfc->common.mouse_grabbed && xf_use_rel_mouse(xfc)))
三处都改成
c
if (xfc->xi_event || xfc->xi_rawevent ||
(xfc->common.mouse_grabbed &&
#ifdef WITH_X11_RELATIVE_MOUSE
xf_use_rel_mouse(xfc)
#else
FALSE
#endif
))
下面一条 sed 命令把 3 处调用全部包进宏,原地备份(.bak):
bash
sed -i.bak \
's/(xfc->common.mouse_grabbed && xf_use_rel_mouse(xfc))/\
(xfc->common.mouse_grabbed \&\& \
#ifdef WITH_X11_RELATIVE_MOUSE\n \
xf_use_rel_mouse(xfc)\n \
#else\n \
FALSE\n \
#endif\n \
)/g' \
client/X11/xf_event.c
做完就编译
bash
cd build
make -j$(nproc)