Ссылка на Qt в CMake -> не может связаться с функцией QML / QtQuick - PullRequest
0 голосов
/ 11 мая 2018

Мы переносим довольно большую кодовую базу с Ubuntu 14.04 на 16.04. Кодовая база использует QML и QtQuick.

Мы используем Qt v5.9.1 в наших зависимостях (который отличается от версии Qt, установленной в системе).

При компиляции у нас есть следующие неопределенные ссылки:

/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `qrand()@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to
`QAccessibleTextUpdateEvent::~QAccessibleTextUpdateEvent()@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QByteArray::mid(int, int) const@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QPainter::setOpacity(double)@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Qml.so.5.9.1:
undefined reference to `QXmlStreamReader::isCDATA() const@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QAnimationDriver::start()@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Qml.so.5.9.1:
undefined reference to `QLocale::toDate(QString const&, QString
const&) const@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QMetaType::unregisterConverterFunction(int,
int)@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QNetworkReply::finished()@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QMetaType::typeName(int)@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Qml.so.5.9.1:
undefined reference to `QXmlStreamReader::documentEncoding()
const@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QChar::toUpper(unsigned int)@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QTouchEvent::TouchPoint::state() const@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Quick.so.5.9.1:
undefined reference to `QElapsedTimer::start()@Qt_5'
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/libQt5Qml.so.5.9.1:
undefined reference to `QDateTime::operator==(QDateTime const&)
const@Qt_5'

... и это продолжается вечно. Ошибки возникают только для функций Qml / QtQuick, а не для других модулей (например, QtCore, QtWidgets ... не выводят ошибок)

Итак, мы проверили наш CMakeLists.txt и вот как Qt связан с:

set(CMAKE_INCLUDE_CURRENT_DIR ON) # Find includes in corresponding    build directories. set(CMAKE_AUTOMOC ON) # Instruct CMake to run moc    automatically when needed.
set(QT_DIR ../../Dependencies/Qt/v5.9.1/5.9.1/gcc_64)
set(CMAKE_PREFIX_PATH ${QT_DIR})

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)

target_link_libraries(${PROJECT_NAME}
     ...
     Qt5::Widgets
     Qt5::Core
     Qt5::Gui
     Qt5::OpenGL
     Qt5::Quick
     Qt5::Qml
     Qt5::QuickControls2 )

При внимательном рассмотрении вывода CMake мы получаем:

   Cannot generate a safe runtime search path for target ToolKitApp
because    files in some directories may conflict with libraries in
implicit    directories:

     runtime library [libQt5Sql.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
       /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib
     runtime library [libQt5OpenGL.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
       /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib
     runtime library [libQt5Widgets.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
       /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib
     runtime library [libQt5Gui.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
       /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib
     runtime library [libQt5Network.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
       /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib
     runtime library [libQt5Core.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
       /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib

   Some of these libraries may not be found correctly.

Так что, похоже, существует несоответствие между системной версией Qt и версией, которую мы используем в наших зависимостях - что мы считаем виновником.

Итак, мы изменили наш CMakeLists.txt, добавив set (Qt5_DIR) ...):

set(CMAKE_PREFIX_PATH ${QT_DIR}) set(Qt5Widgets_DIR       
../../Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake/Qt5Widgets)
set(Qt5Core_DIR          
../../Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake/Qt5Core)
set(Qt5Gui_DIR           
../../Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake/Qt5Gui)
set(Qt5OpenGL_DIR        
../../Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake/Qt5OpenGL)
set(Qt5Quick_DIR         
../../Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake/Qt5Quick)
set(Qt5Qml_DIR           
../../Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake/Qt5Qml)
set(Qt5QuickControls2_DIR
../../Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake/Qt5QuickControls2)
find_package(Qt5Widgets        REQUIRED NO_DEFAULT_PATH)
find_package(Qt5Core           REQUIRED NO_DEFAULT_PATH)
find_package(Qt5Gui            REQUIRED NO_DEFAULT_PATH)
find_package(Qt5OpenGL         REQUIRED NO_DEFAULT_PATH)
find_package(Qt5Quick          REQUIRED NO_DEFAULT_PATH)
find_package(Qt5Qml            REQUIRED NO_DEFAULT_PATH)
find_package(Qt5QuickControls2 REQUIRED NO_DEFAULT_PATH)

Но это не улучшило ситуацию.

Есть идеи о том, что происходит?

------------------ РЕДАКТИРОВАТЬ ------------------

Мы внесли следующую модификацию в CMakeLists.txt

set(CMAKE_PREFIX_PATH   /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64)
find_package(Qt5 COMPONENTS Core Gui OpenGL Quick QmlQuickControls2)

message("Qt5               : " Qt5_DIR)
message("Qt5Core           : " Qt5Core_DIR)
message("Qt5Widgets        : " Qt5Widgets_DIR)
message("Qt5Gui            : " Qt5Gui_DIR)
message("Qt5OpenGL         : " Qt5OpenGL_DIR)
message("Qt5Quick          : " Qt5Quick_DIR)
message("Qt5Qml            : " Qt5Qml_DIR)
message("Qt5QuickControls2 : " Qt5QuickControls2_DIR)

, который не изменяет поведение, но выводит

Qt5               : /usr/lib/x86_64-linux-gnu/cmake
Qt5Core           : /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake
Qt5Widgets        : /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake
Qt5Gui            : /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake
Qt5OpenGL         : /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64/lib/cmake
Qt5Quick          : /usr/lib/x86_64-linux-gnu/cmake
Qt5Qml            : /usr/lib/x86_64-linux-gnu/cmake
Qt5QuickControls2 : /usr/lib/x86_64-linux-gnu/cmake

, который подтверждает, что существует несоответствие между версией Qt для системы / пакета и версией custom / зависимостей, но не предлагает решения.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Как сказал Мартин, похоже, что CMake связывается с библиотеками в вашей новой системе, а не с портированными из вашей старой системы. Кроме того, в вашей новой системе установлены библиотеки Qt через менеджер пакетов Ubuntu / Debian Aptitude, и отсутствуют пакеты qtdeclarative5-dev и qml modules (вы можете установить их в Ubuntu с помощью sudo apt install qtdeclarative5-dev qtquick *). Я думаю, причина, по которой CMake не связывается с вашими портированными библиотеками, вероятно, из-за проблем с владением. Вы пытались проверить владение с помощью команды "ls -lah" в родительском каталоге. Владение может быть назначено корню сейчас, вы можете изменить его с помощью команды "sudo chown -R username: group Directory".

0 голосов
/ 11 мая 2018

Судя по вашему выводу, у вас есть следующие настройки:

  • У вас есть некоторые (но не все) библиотеки Qt 5 (включая файлы разработки), установленные через менеджер пакетов.
  • Однако, вероятно, у вас не установлены библиотеки QtQuick (для разработчиков).
  • Кроме того, у вас установлена ​​Qt в /home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/ (я полагаю, она установлена ​​через официальный установщик Qt).
  • Полагаю, вы пытаетесь скомпилировать и связать версию Qt в вашем доме.

Я думаю, что что-то не так в настройке проекта (то есть, как вы вызываете * 1014).*), поскольку CMake, кажется, сначала ищет Qt в вашей системной папке и - когда вы устанавливаете некоторые переменные в вашем файле CMakeLists.txt, что заставляет его также учитывать установку в вашем домашнем каталоге, - выборочно связывает библиотеку Quick с другойУстановка Qt.Это определенно может привести к таким ошибкам компоновщика, в частности, если системная версия Qt старше той, которую вы установили у себя дома.

Короче говоря: вы пытались вызвать CMake, передав ему переменную CMAKE_PREFIX_PATHв командной строке?В вашем примере, я думаю, это должно выглядеть так:

cmake \
    -DCMAKE_PREFIX_PATH=/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/5.9.1/gcc_64 \
    ..

Установка Qt5Core_DIR и тому подобное определенно не должны быть необходимыми.Из моего опыта работы с Qt и CMake, когда вам нужно установить их, что-то не так с вашей настройкой.

...