Мы работаем над переносом проекта из Ubuntu 14.04 в Ubuntu 16.04, и мы столкнулись с проблемой при использовании библиотеки под названием PCL вместе с Qt. Симптомом было то, что QtQuick и QtQml имели несколько функций без ссылок при попытке построить проект. Теперь проблема решена, но она выдвинула на первый план поведение в Cmake, которое мы не понимаем.
PCL 1.8.1 использует Qt 5.5.1 из системы (/ usr / lib / x86_64-linux-gnu / cmake) - это версия Qt по умолчанию, устанавливаемая через пакеты apt-get.
Теперь оказалось, что наш проект использует Qt 5.9.1 (в качестве зависимости), и версии 2 Qt создали несоответствие для Qt. Несоответствие мы не понимаем.
Мы привыкли вызывать библиотеки в следующем порядке:
# PCL
set(CMAKE_PREFIX_PATH ../Dependencies/pcl/v1.8.1)
find_package(PCL 1.7 REQUIRED COMPONENTS common io filters)
# Qt
set(CMAKE_AUTOMOC ON) # Instruct CMake to run moc automatically when needed.
set(CMAKE_PREFIX_PATH ../Dependencies/Qt/v5.9.1/5.9.1/gcc_64)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(Qt5Quick REQUIRED)
find_package(Qt5Qml REQUIRED)
find_package(Qt5QuickControls2 REQUIRED)
Затем мы распечатали пути, возвращаемые инструкциями find_package, и заметили, что все библиотеки, используемые PCL (Qt5Widgets, Qt5Core, Qt5Gui и Qt5OpenGL), ссылались на старую версию Qt 5.5.1. И библиотеки, используемые только нашим исполняемым файлом, ссылались на правильную новую версию Qt 5.9.1. Это несоответствие версий вызвало предупреждение в Cmake и сбой сборки с многочисленными ошибками ссылок.
Итак, мы изменили порядок вызовов и поменялись местами Qt и PCL:
# Qt
set(CMAKE_AUTOMOC ON) # Instruct CMake to run moc automatically when needed.
set(CMAKE_PREFIX_PATH ../Dependencies/Qt/v5.9.1/5.9.1/gcc_64)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(Qt5Quick REQUIRED)
find_package(Qt5Qml REQUIRED)
find_package(Qt5QuickControls2 REQUIRED)
# PCL
set(CMAKE_PREFIX_PATH ../Dependencies/pcl/v1.8.1)
find_package(PCL 1.7 REQUIRED COMPONENTS common io filters)
С этой конфигурацией у нас больше не было ошибок. Отсюда наш вопрос: почему find_package не нашел правильную версию Qt на первом месте?
Как вы можете заставить find_package искать пакеты по заданному пути? то есть мы можем заставить find_package переопределить ранее известный ему путь?
------------------------ EDIT ---------------------- -
Благодаря предложению @ Цыварева мы смогли решить нашу проблему. Мы должны были добавить unset (Qt5 CACHE)
в первом примере, например так:
# PCL
set(CMAKE_PREFIX_PATH ../Dependencies/pcl/v1.8.1)
find_package(PCL 1.7 REQUIRED COMPONENTS common io filters)
# Qt
unset (Qt5 CACHE)
set(CMAKE_AUTOMOC ON) # Instruct CMake to run moc automatically when needed.
set(CMAKE_PREFIX_PATH ../Dependencies/Qt/v5.9.1/5.9.1/gcc_64)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(Qt5Quick REQUIRED)
find_package(Qt5Qml REQUIRED)
find_package(Qt5QuickControls2 REQUIRED)