Qt5.5:如何在 CMake 中包含 Qt 的 qtpcre.lib 和 qtharfbuzzng.lib?
Qt5.5: How can I include Qt's qtpcre.lib and qtharfbuzzng.lib with CMake?
我刚刚将我们的一个项目从 Qt 5.3.1 升级到 Qt 5.5。我们正在使用静态构建的 Qt(我们自己构建)和 win32-msvc2013 make 规范。
升级后,我收到了几个未解决的外部问题,我可以回溯到构建 Qt 后已经在 lib
目录中的以下两个库:
qtpcre(d).lib: Qt wrapper around the Perl Compatible Regular Expressions
library
qtharfbuzzng(d).lib: Qt wrapper around the Harf Buzz NG Unicode Text shaping library
手动将这些库(Qt 库,而不是原始库)添加到我的 Visual Studio 项目配置中解决了链接器错误,但我们的 VS 项目是使用 CMake(我认为是 3.0.2)生成的。
有没有办法使用 Qt5::Core 或类似于 Qt 插件的目标来包含这些库?或者我必须使用 FIND_LIBRARY 或类似的方法手动添加它们吗?
到目前为止,我还没有找到与这两个库相关的任何 CMake 脚本。
来源
首先是 Qt *Config.cmake
代码问题。你可以看看这些bug(不是Windows完全一样而是完全一样):
解决方法(简单,无效)
Link 手动:
add_executable(foo foo.cpp)
target_link_libraries(
foo
Qt5::Widgets
"${_qt5Widgets_install_prefix}/lib/qtpcre.lib"
)
解决方法(复杂、有效)
使用INTERFACE_LINK_LIBRARIES 属性(在这种情况下,您不必link它到每个使用Qt的目标并且可以继续使用Qt5::Widgets)。另外,您可以使用生成器表达式在 Debug 和 Release 变体之间切换:
get_target_property(
linked_libs
Qt5::Widgets
INTERFACE_LINK_LIBRARIES
)
set(debug "${_qt5Widgets_install_prefix}/lib/qtpcred.lib")
set(nondebug "${_qt5Widgets_install_prefix}/lib/qtpcre.lib")
set(debug_gen_expr "$<$<CONFIG:Debug>:${debug}>")
set(nondebug_gen_expr "$<$<NOT:$<CONFIG:Debug>>:${release}>")
set(gen_expr "${debug_gen_expr};${nondebug_gen_expr}")
set_target_properties(
Qt5::Widgets
PROPERTIES
INTERFACE_LINK_LIBRARIES "${gen_expr};${linked_libs}"
)
用法:
add_executable(foo foo.cpp)
add_executable(boo boo.cpp)
# no need to link qtpcred.lib manually
target_link_libraries(foo PUBLIC Qt5::Widgets)
# will be linked to target `boo` automatically too
target_link_libraries(boo PUBLIC Qt5::Widgets)
猎人
代码取自 Qt5Widgets_HunterPlugin 模块,安装在 Qt5WidgetsConfig.cmake
附近并由它自动加载。也可以在那里找到适用于其他平台的同类解决方法(iOS、OSX、Linux、Visual Studio、MinGW)。
我刚刚将我们的一个项目从 Qt 5.3.1 升级到 Qt 5.5。我们正在使用静态构建的 Qt(我们自己构建)和 win32-msvc2013 make 规范。
升级后,我收到了几个未解决的外部问题,我可以回溯到构建 Qt 后已经在 lib
目录中的以下两个库:
qtpcre(d).lib: Qt wrapper around the Perl Compatible Regular Expressions library
qtharfbuzzng(d).lib: Qt wrapper around the Harf Buzz NG Unicode Text shaping library
手动将这些库(Qt 库,而不是原始库)添加到我的 Visual Studio 项目配置中解决了链接器错误,但我们的 VS 项目是使用 CMake(我认为是 3.0.2)生成的。
有没有办法使用 Qt5::Core 或类似于 Qt 插件的目标来包含这些库?或者我必须使用 FIND_LIBRARY 或类似的方法手动添加它们吗? 到目前为止,我还没有找到与这两个库相关的任何 CMake 脚本。
来源
首先是 Qt *Config.cmake
代码问题。你可以看看这些bug(不是Windows完全一样而是完全一样):
解决方法(简单,无效)
Link 手动:
add_executable(foo foo.cpp)
target_link_libraries(
foo
Qt5::Widgets
"${_qt5Widgets_install_prefix}/lib/qtpcre.lib"
)
解决方法(复杂、有效)
使用INTERFACE_LINK_LIBRARIES 属性(在这种情况下,您不必link它到每个使用Qt的目标并且可以继续使用Qt5::Widgets)。另外,您可以使用生成器表达式在 Debug 和 Release 变体之间切换:
get_target_property(
linked_libs
Qt5::Widgets
INTERFACE_LINK_LIBRARIES
)
set(debug "${_qt5Widgets_install_prefix}/lib/qtpcred.lib")
set(nondebug "${_qt5Widgets_install_prefix}/lib/qtpcre.lib")
set(debug_gen_expr "$<$<CONFIG:Debug>:${debug}>")
set(nondebug_gen_expr "$<$<NOT:$<CONFIG:Debug>>:${release}>")
set(gen_expr "${debug_gen_expr};${nondebug_gen_expr}")
set_target_properties(
Qt5::Widgets
PROPERTIES
INTERFACE_LINK_LIBRARIES "${gen_expr};${linked_libs}"
)
用法:
add_executable(foo foo.cpp)
add_executable(boo boo.cpp)
# no need to link qtpcred.lib manually
target_link_libraries(foo PUBLIC Qt5::Widgets)
# will be linked to target `boo` automatically too
target_link_libraries(boo PUBLIC Qt5::Widgets)
猎人
代码取自 Qt5Widgets_HunterPlugin 模块,安装在 Qt5WidgetsConfig.cmake
附近并由它自动加载。也可以在那里找到适用于其他平台的同类解决方法(iOS、OSX、Linux、Visual Studio、MinGW)。