3

我刚刚将我们的一个项目从 Qt 5.3.1 升级到 Qt 5.5。我们正在使用带有 win32-msvc2013 制作规范的静态构建 Qt(我们自己构建)。
升级后,我收到了一些未解决的外部文件,我可以回溯到lib构建 Qt 后已经在目录中的以下两个库:

qtpcre(d).lib:围绕Perl 兼容正则表达式 库的
Qt 包装器 qtharfbuzzng(d).lib:围绕Harf Buzz NG Unicode 文本整形库的 Qt 包装器

手动将这些库(Qt 库,而不是原始库)添加到我的 Visual Studio 项目配置中可以解决链接器错误,但我们的 VS 项目是使用 CMake 生成的(我认为是 3.0.2)。

有没有办法使用 Qt5::Core 之类的目标或类似于 Qt 插件的东西来包含这些库?还是我必须使用FIND_LIBRARY或类似方法手动添加它们?到目前为止,我还没有找到任何与这两个库相关的 CMake 脚本。

4

1 回答 1

3

起源

首先这是一个Qt*Config.cmake代码问题。您可以查看这些错误(这与 Windows 不完全一样,但完全相同):

解决方法(简单,无效)

手动链接它们:

add_executable(foo foo.cpp)
target_link_libraries(
    foo
    Qt5::Widgets
    "${_qt5Widgets_install_prefix}/lib/qtpcre.lib"
)

解决方法(复杂,有效)

使用INTERFACE_LINK_LIBRARIES属性(在这种情况下,您不必将它链接到使用 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)。

于 2015-08-14T18:55:57.067 回答