Qt5.5: Как включить Qtpcre.lib и qtharfbuzzng.lib в CMake?

Я только что обновил один из наших проектов с Qt 5.3.1 до Qt 5.5. Мы используем статически собранный Qt (мы собираем его сами) со спецификацией make win32-msvc2013.
После обновления я получил пару неразрешенных внешних файлов, которые я мог бы отследить до следующих двух библиотек, которые уже находятся в каталог lib после сборки Qt:

qtpcre(d).lib: оболочка Qt для библиотеки Perl-совместимых регулярных выражений
qtharfbuzzng(d). lib: оболочка Qt вокруг библиотеки Harf Buzz NG Unicode Text Shaping

Добавление этих библиотек вручную (Qt, а не оригинальных) в мою конфигурацию проекта Visual Studio устраняет ошибки компоновщика, но наши проекты VS генерируются с использованием CMake (я думаю, 3.0.2).

Есть ли способ включить эти библиотеки, используя такие цели, как Qt5::Core или что-то похожее на плагины Qt? Или мне нужно добавить их вручную, используя FIND_LIBRARY или похожий? Пока я не нашел скриптов CMake, связанных с этими двумя библиотеками.


person Tim Meyer    schedule 14.08.2015    source источник


Ответы (1)


Источник

Прежде всего, это проблема с кодом 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).

person Community    schedule 14.08.2015
comment
Спасибо, это прекрасно работает даже без опции PUBLIC в target_link_libraries. Единственное, что я изменил, это способ получения пути к библиотеке Qt: get_target_property(QT5WIDGETS_LOCATION Qt5::Widgets LOCATION) и get_filename_component(QT5_LIB_PATH ${QT5WIDGETS_LOCATION} DIRECTORY). Это работает даже при перемещении установки Qt. - person Tim Meyer; 20.08.2015
comment
Сложность операторов не является проблемой, так как у нас в любом случае есть центральный файл CMake, который включается в каждый проект нашего отдела. Добавление кода в этот файл позволило нам не изменять ни один файл проекта, что является идеальным решением. - person Tim Meyer; 20.08.2015