使用vcpkg在windows上快速编译freerdp

583 阅读2分钟

网上的windows编译freerdp的教程大多需要繁琐的手工配置,而且配置支持的freerdp的特性特别有限。本文介绍了一种使用vcpkg自动管理和编译freerdp依赖的第三方库的快速编译wfreerdp的方法,编译链接方式为mt-static没有过多的DLL依赖。

编译环境

OS:win2022 或者 win10

msvc: vs2017 v141

Ninja: 1.11.1

cmake: 3.27.1

git:2.41.0

vcpkg:github.com/microsoft/v…

使用choco安装编译环境

1、安装choco

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

2、安装 vs2017

choco install -y VisualStudio2017Community # 或者visualstudio2017buildtools

3、安装Ninja

choco install -y ninja

4、安装cmake

choco install -y cmake.install --installargs '"ADD_CMAKE_TO_PATH=System"'

5、安装git

choco install -y git

6、安装vcpkg

这里一定要从git clone,因为vcpkg.json里面用到了override指定了依赖库的版本

mkdir workspace
cd workspace
git clone https://github.com/microsoft/vcpkg.git
.\vcpkg\bootstrap-vcpkg.bat

编译freerdp

1、拉取代码

git clone https://github.com/FreeRDP/FreeRDP.git -b 2.11.7

2、编译参数配置,使用CMakePresets.json文件(FreeRDP项目根目录下新建)

{
  "version": 3,
  "cmakeMinimumRequired": {
    "major": 3,
    "minor": 15,
    "patch": 0
  },
  "configurePresets": [
    {
      "name": "windows-default",
      "hidden": true,
      "binaryDir": "${sourceDir}/cmake-build-${presetName}",
      "generator": "Ninja",
      "toolset": {
        "value": "v141",
        "strategy": "external"
      },
      "architecture": {
        "value": "x86",
        "strategy": "external"
      },
      "cacheVariables": {
        "CMAKE_RC_COMPILER": "rc",
        "CMAKE_C_COMPILER": "cl.exe",
        "CMAKE_CXX_COMPILER": "cl.exe",
        "CMAKE_SYSTEM_VERSION": "10.0",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
      },
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Windows"
      }
    },
    {
      "name": "freerdp-debug",
      "displayName": "freerdp Debug",
      "inherits": "windows-default",
      "description": "freerdp debug",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
        "MSVC_RUNTIME": "static",
        "BUILD_SHARED_LIBS": "OFF",
        "WITH_FFMPEG": "OFF",
        "WITH_DSP_FFMPEG": "OFF",
        "WITH_JPEG": "OFF",
        "WITH_CAIRO": "OFF",
        "WITH_SWSCALE": "ON",
        "WITH_OPENH264": "ON",
        "WITH_MANPAGES": "ON",
        "WITH_NATIVE_SSPI": "ON",
        "WITH_SSE2": "ON",
        "WITH_WINMM": "ON",
        "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../vcpkg/scripts/buildsystems/vcpkg.cmake",
        "VCPKG_TARGET_TRIPLET": "x86-windows-static"
      }
    },
    {
      "name": "freerdp-release",
      "displayName": "freerdp Release",
      "inherits": "windows-default",
      "description": "freerdp release",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
        "MSVC_RUNTIME": "static",
        "BUILD_SHARED_LIBS": "OFF",
        "WITH_FFMPEG": "OFF",
        "WITH_DSP_FFMPEG": "OFF",
        "WITH_JPEG": "OFF",
        "WITH_CAIRO": "OFF",
        "WITH_SWSCALE": "ON",
        "WITH_OPENH264": "ON",
        "WITH_MANPAGES": "ON",
        "WITH_NATIVE_SSPI": "ON",
        "WITH_SSE2": "ON",
        "WITH_WINMM": "ON",
        "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../vcpkg/scripts/buildsystems/vcpkg.cmake",
        "VCPKG_TARGET_TRIPLET": "x86-windows-static"
      }
    }
  ]
}

3、vcpkg.json配置,可以利用vcpkg自动编译第三方库(FreeRDP项目根目录下新建)

{
  "name": "depends",
  "version-string": "1.0.0",
  "dependencies": [
    "zlib",
    "libusb",
    "openssl",
    {
      "name": "ffmpeg",
      "default-features": false,
      "features": ["swscale"]
    },
    "openh264"
  ],
  "builtin-baseline": "0789630513565c6ea73caad01f98313cdec1b073",
  "overrides": [
    { "name": "openssl", "version-string": "1.1.1n" },
    { "name": "ffmpeg", "version-string": "4.4" }
  ]
}

4、修正SWSCALE编译时缺少AVUtil.lib的问题

cmake/FindSWScale.cmake 文件中添加

find_library(AVUtil_LIBRARY avutil PATHS ${SWScale_LIBRARY_DIRS})

libfreerdp\CMakeLists.txt 中添加

freerdp_library_add(${AVUtil_LIBRARY})

编译

cmake --preset="freerdp-release"    # 这个过程中vcpkg会下载编译所需要的工具和源码,需要良好的网络环境
cmake --build cmake-build-freerdp-release --config Release

运行

FreeRDP-Manuals/User/FreeRDP-User-Manual.markdown at master · awakecoding/FreeRDP-Manuals

编译好的文件在 cmake-build-freerdp-release/wfreerdp.exe

.\wfreerdp.exe /v:<server>[:port] /u:<username> /p:<password>  /cert-ignore