Qt5 使用 cmake 和 vcpkg 在 macOS 上构建为共享库

Qt5 build as shared library on macos using cmake and vcpkg

在 macOS Monterey(版本 12.2.1)上使用 cmakevcpkgQt 库构建为共享库失败。尽管使用默认 VCPKG_LIBRARY_LINKAGE(即静态),构建库并使其成功可用。只有当我尝试将其构建为共享库时才会出现此问题。

我正在使用的完整工具集:

在我的 PreLoad.cmake 文件中 - 包含以下代码:

...
set(VCPKG_TARGET_TRIPLET "x64-osx")
set(VCPKG_HOST_TRIPLET "x64-osx")
set(CMAKE_OSX_ARCHITECTURES x86_64)
...

当 运行 cmake -DCMAKE_BUILD_TYPE=Debug .. Qt 库(最终)构建成功。但是,当我尝试将其构建为共享库以便稍后通过将此代码段添加到我的 PreLoad.cmake:

动态链接到我的代码时
if((${PORT} MATCHES "qt5-base") OR (${PORT} MATCHES "qt5-tools"))
    set(VCPKG_LIBRARY_LINKAGE dynamic)
else()
    set(VCPKG_LIBRARY_LINKAGE static)
endif()

vcpkg 安装过程失败并出现此错误:

-- Running vcpkg install - failed
CMake Error at vcpkg/scripts/buildsystems/vcpkg.cmake:834 (message):
  vcpkg install failed.  See logs for more information:
  /Users/avibiton/Dev/main/build/vcpkg-manifest-install.log
Call Stack (most recent call first):
  /opt/homebrew/Cellar/cmake/3.22.3/share/cmake/Modules/CMakeDetermineSystem.cmake:124 (include)
  CMakeLists.txt:30 (project)

-- Configuring incomplete, errors occurred!

检查 vcpkg-manifest-install.log 文件并从那里进入 vcpkg/buildtrees/qt5-base/config-x64-osx-dbg-err.log 文件,我遇到了这个错误消息:

ERROR: debug-only framework builds are not supported. Configure with -no-framework if you want a pure debug build.

所以我转到这个文件 vcpkg/ports/qt5-base/portfile.cmake 并尝试将 -no-framework 标志附加到 CORE_OPTIONS 变量,如下所示:

...
## 3rd Party Libs
list(APPEND CORE_OPTIONS
    -system-zlib
    -system-libjpeg
    -system-libpng
    -system-freetype
    -system-pcre
    -system-doubleconversion
    -system-sqlite
    -system-harfbuzz
    -icu
    -no-vulkan
    -no-angle # Qt does not need to build angle. VCPKG will build angle!
    -no-glib
    -no-framework # This is my change
    )
...

但这个改变本身就是一个兔子洞:(

如果有人使用 cmake 和 vcpkg 在 macOS 上成功构建 Qt 作为共享库,我将不胜感激!

如果您不需要 Qt 和其他内置调试配置的 vcpkg 依赖项,您还可以在 PreLoad.cmake[=19= 中设置 VCPKG_BUILD_TYPE ]

...    
set(VCPKG_BUILD_TYPE release)
...

如果您的其他端口需要在调试配置中构建,您也可以像 VCPKG_LIBRARY_LINKAGE

一样在每个端口的基础上进行设置
...
set(VCPKG_LIBRARY_LINKAGE static)
if(PORT MATCHES "qt5-")
    set(VCPKG_LIBRARY_LINKAGE dynamic)
    set(VCPKG_BUILD_TYPE release)
endif()
...

由于此设置很可能会破坏 Windows 构建,因此您应该使用仅用于 macOS 构建的自定义三元组,而不是可能用于所有平台的 PreLoad.cmake,包括 Windows。 您可以在 vcpkg 文档 https://vcpkg.io/en/docs/examples/overlay-triplets-linux-dynamic.html.

中找到有关如何执行此操作的示例