繁体   English   中英

在CMake中链接到Qt->无法链接到QML / QtQuick函数

[英]Link to Qt in CMake --> cannot link to QML/QtQuick function

我们正在将相当大的代码库从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的系统/软件包版本与自定义/依赖版本之间不匹配,但未提供解决方案。

从您的输出中,我想您具有以下设置:

  • 您已经通过软件包管理器安装了一些(但不是全部)Qt 5库(包括开发文件)。
  • 但是,您可能没有安装QtQuick(开发)库。
  • 此外,您在/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/安装了Qt(我想是通过官方的Qt安装程序安装的)。
  • 我想您会尝试在您的家中编译和链接到Qt版本。

我认为配置项目的方式(即调用cmake的方式)出了问题,因为CMake似乎首先在系统位置中搜索Qt,并且-在CMakeLists.txt文件中设置了一些变量来强制执行该操作还考虑在主目录中进行安装-从其他Qt安装中有选择地链接到Quick库。 这绝对可能导致此类链接器错误,尤其是如果系统Qt版本比您家中安装的版本更旧。

长话短说:您是否尝试过在命令行中通过CMAKE_PREFIX_PATH变量来调用CMake? 在您的示例中,我想它应该像这样:

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

绝对不需要设置Qt5Core_DIR等。 根据我在Qt和CMake上的经验,当您需要设置这些设置时,您的设置有问题。

正如Martin所说,似乎CMake链接到新系统中的库,而不是旧系统中移植的库。 另外,您的新系统通过Ubuntu / Debian Aptitude软件包管理器安装了Qt库,并且缺少qtdeclarative5-dev和qml模块软件包(您可以使用sudo apt install qtdeclarative5-dev qtquick *将它们安装在Ubuntu上)。 我之所以认为CMake不链接到您的移植库的原因,可能是因为所有权问题。 您是否尝试在父目录中使用“ ls -lah”命令检查所有权。 现在可以将所有权分配给根,您可以使用“ sudo chown -R username:group Directory”命令对其进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM