Qt5 使用 cmake 和 vcpkg 在 macOS 上构建为共享库
Qt5 build as shared library on macos using cmake and vcpkg
在 macOS Monterey(版本 12.2.1)上使用 cmake
和 vcpkg
将 Qt
库构建为共享库失败。尽管使用默认 VCPKG_LIBRARY_LINKAGE
(即静态),构建库并使其成功可用。只有当我尝试将其构建为共享库时才会出现此问题。
我正在使用的完整工具集:
macOS 蒙特雷 - 12.2.1 (21D62)。
Xcode
13.3(内部版本 13E113)。
cmake
版本 3.22.3.
vcpkg
标签 - 2022.03.10(af2287382b1991dbdcb7e5112d236f3323b9dd7a
).
Qt
版本由这个 vcpkg
标签隐式设置 - 5.15.3
.
在我的 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.
中找到有关如何执行此操作的示例
在 macOS Monterey(版本 12.2.1)上使用 cmake
和 vcpkg
将 Qt
库构建为共享库失败。尽管使用默认 VCPKG_LIBRARY_LINKAGE
(即静态),构建库并使其成功可用。只有当我尝试将其构建为共享库时才会出现此问题。
我正在使用的完整工具集:
macOS 蒙特雷 - 12.2.1 (21D62)。
Xcode
13.3(内部版本 13E113)。cmake
版本 3.22.3.vcpkg
标签 - 2022.03.10(af2287382b1991dbdcb7e5112d236f3323b9dd7a
).Qt
版本由这个vcpkg
标签隐式设置 -5.15.3
.
在我的 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.