【发布时间】:2018-05-11 10:36:31
【问题描述】:
我们正在将一个相当大的代码库从 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 ubuntu cmake qml qtquick2