我刚刚将我们的一个项目从Qt 5.3.1升级到Qt 5.5。我们使用win32-msvc2013 make规范使用静态构建的Qt(我们自己构建)
升级后,我收到了一些未解决的外部因素,我可以回溯到以下两个库,这些库在构建Qt之后已经在lib
目录中了:
qtpcre(d).lib:围绕Perl Compatible Regular Expressions 库的Qt包装器 qtharfbuzzng(d).lib:围绕Harf Buzz NG Unicode Text shaping库的Qt包装器
手动将这些库(Qt,而不是原始库)添加到我的Visual Studio项目配置中可以解决链接器错误,但我们的VS项目是使用CMake生成的(我认为是3.0.2)。
有没有办法使用像Qt5 :: Core或类似Qt插件的目标来包含这些库?或者我是否必须使用FIND_LIBRARY或类似手动添加它们? 到目前为止,我还没有发现任何与这两个库相关的CMake脚本。
答案 0 :(得分: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)。