2016-04-27 85 views
0

我剛開始使用Qt。編譯第一個示例時遇到問題。
main.cpp中:cmake的鏈接問題:未定義參考QPushButton

#include <QCoreApplication> 
#include <QPushButton> 

int main(int argc, char** argv) 
{ 
    QCoreApplication app(argc, argv); 
    QPushButton button ("Hello world !"); 

return app.exec(); 
} 

CMake.txt:

cmake_minimum_required(VERSION 2.6) 
project(new) 
find_package(Qt4 REQUIRED) 
enable_testing() 
include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) 
set(source_SRCS main.cpp) 
qt4_automoc(${source_SRCS}) 
add_executable(new ${source_SRCS}) 
target_link_libraries(new${QT_QTCORE_LIBRARY}) 
add_subdirectory(tests) 
install(TARGETS new RUNTIME DESTINATION .) 

我得到在建築物的錯誤是:

undefined reference to `QPushButton::QPushButton(QString const&,QWidget*)' 

它是連接問題,但我怎麼能解決它?

+0

'target_link_libraries(新$ {} QT_QTCORE_LIBRARY)'應該是'target_link_libraries(新$ {} QT_LIBRARIES)' – drescherjm

回答

2

你有三個問題:

  1. 您沒有鏈接到Gui模塊(Qt 5中的Widgets模塊)。這包括在the other answer中。

  2. 您必須根據小部件的應用程序使用QApplication。由於QPushButton來自Gui模塊(Qt5中的Widget),因此您不能僅僅使用QCoreApplicationQGuiApplication:只要您嘗試實例化QWidget,程序就會崩潰。

  3. 你沒有顯示按鈕,所以當你的程序啓動時,一旦你修復上述問題,你將看不到任何東西。

main.cpp應該是這樣的:

#if QT_VERSION < QT_VERSION_CHECK(5,0,0) 
#include <QtGui> 
#else 
#include <QtWidgets> 
#endif 

int main(int argc, char** argv) 
{ 
    QApplication app(argc, argv); 
    QPushButton button ("Hello world !"); 
    button.show(); 
    return app.exec(); 
} 
+0

謝謝。我沒有在main.cpp中包含所有內容。現在一切都很好。 – user3616359

0

你也將需要對QtGui和QtWidgets庫鏈接。在qmake中,它處理許多庫中的哪一個組成Qt,你必須在cmake中手工完成。

如果你看一下QPushButton的文檔(http://doc.qt.io/qt-5/qpushbutton.html),該「QMAKE」行顯示你所需要的庫。

0

考慮使用QMAKE代替cmake的使用Qt。

無論如何,QCoreApplication(請參閱docs)是主應用程序類的控制檯版本,不適用於GUI應用程序。 QPushButton是一個小部件類,可以單獨存在,將會使一個窗口(雖然你必須明確地show()它爲),但只有與QApplication

當你的* .pro文件中使用的qmake您需要包括widgets像這樣:

CONFIG += widgets 

,並確保你沒有

CONFIG -= gui 

做,如果你堅持使用cmake然後見here

+0

謝謝!我之前沒有使用過qmake,但我會嘗試。我看到你cmake的解決方案。它在這行find_package(Qt4Widgets REQUIRED)上失敗。我是否需要一些額外的安裝。或者手動添加Qt4Widgets .cmake文件。 – user3616359

+0

'find_package(Qt4Widgets REQUIRED)'這是錯誤的。它應該是'find_package(Qt4 REQUIRED)' – drescherjm

4

這裏是什麼,我認爲你缺少:

find_package(Qt4 REQUIRED QtGui) 

看着你的CMake,你可能想改變target_link_libraries以下:

target_link_libraries(new ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY}) 
+0

這會構建程序,但是執行後的錯誤是「QWidget:不使用GUI時不能創建QWidget」 Aborted(核心轉儲)「。但是我無法鏈接到QtWidgets庫。 – user3616359

+1

然後錯誤可能在您的主....「Qt要求您創建任何QWidget子類之前創建一個QApplication」 – Stefano

+0

看看這個:http://stackoverflow.com/a/5521791/855844 – Stefano