[英]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的系統/軟件包版本與自定義/依賴版本之間不匹配,但未提供解決方案。
從您的輸出中,我想您具有以下設置:
/home/onilsson/DevRoot/Dependencies/Qt/v5.9.1/
安裝了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.