Qt5.5:如何包括Qt';带CMake的qtpcre.lib和qtharfbuzzng.lib?
我刚刚将我们的一个项目从Qt5.3.1升级到Qt5.5。我们在win32-msvc2013 make规范中使用静态构建的Qt(我们自己构建)。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)生
升级后,我收到了几个未解析的外部文件,我可以在构建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)