Несоответствие cmake при использовании 2 библиотек (Qt и PCL) - PullRequest
0 голосов
/ 05 июля 2018

Мы работаем над переносом проекта из 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...