Qt5.5:如何包括Qt';带CMake的qtpcre.lib和qtharfbuzzng.lib?

Qt5.5:如何包括Qt';带CMake的qtpcre.lib和qtharfbuzzng.lib?,cmake,qt5.5,Cmake,Qt5.5,我刚刚将我们的一个项目从Qt5.3.1升级到Qt5.5。我们在win32-msvc2013 make规范中使用静态构建的Qt(我们自己构建)。 升级后,我收到了几个未解析的外部文件,我可以在构建Qt后回溯到lib目录中的以下两个库: qtpcre(d).lib:库周围的Qt包装器 qtharfbuzzng(d).lib:库周围的Qt包装器 手动将这些库(Qt库,而不是原始库)添加到我的Visual Studio项目配置中可以解决链接器错误,但我们的VS项目是使用CMake(我认为是3.0.2)生

我刚刚将我们的一个项目从Qt5.3.1升级到Qt5.5。我们在win32-msvc2013 make规范中使用静态构建的Qt(我们自己构建)。
升级后,我收到了几个未解析的外部文件,我可以在构建Qt后回溯到
lib
目录中的以下两个库:

qtpcre(d).lib:库周围的Qt包装器
qtharfbuzzng(d).lib:库周围的Qt包装器

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

有没有一种方法可以使用诸如Qt5::Core或类似于Qt插件的目标来包含这些库?或者我必须使用或类似工具手动添加它们吗? 到目前为止,我还没有找到任何与这两个库相关的CMake脚本。

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

解决方法(简单,无效) 手动链接它们:

add_executable(foo foo.cpp)
target_link_libraries(
    foo
    Qt5::Widgets
    "${_qt5Widgets_install_prefix}/lib/qtpcre.lib"
)
解决方法(复杂、有效) 使用属性(在这种情况下,您不必将它链接到每个使用Qt的目标,并且可以只使用Qt5::Widgets)。此外,您还可以使用生成器表达式在调试和发布变体之间切换:

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}"
)
猎人
代码取自安装在Qt5WidgetsConfig.cmake附近的模块,并由其自动加载。其他平台(iOS、OSX、Linux、Visual Studio、MinGW)也可以找到类似的解决方案。

谢谢,即使没有
target\u link\u库中的
PUBLIC
选项,这也很有魅力。我唯一改变的是检索Qt库路径的方式:
get_target_属性(QT5WIDGETS\u LOCATION Qt5::Widgets LOCATION)
get_filename\u组件(Qt5\u LIB\u Path${QT5WIDGETS\u LOCATION}目录)
。这甚至在移动Qt安装时也有效。声明的复杂性不是问题,因为我们有一个中央CMake文件,它包含在我们部门的每个项目中。向该文件中添加代码使我们不必更改任何单个项目文件,这是一个完美的解决方案。
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)