2017-04-12 83 views
1

我試圖用Qt GUI(Qt 5.6.0,因爲我不能依賴Cxx11功能)擴展現有的makefile C++項目。問題是我無法讓Qt正確鏈接。我想在Win7(x86-64)下創建一個X86應用程序(32位)。我已經安裝了從Qt下載頁面https://download.qt.io/archive/qt/5.6/5.6.0/獲得的qt-opensource-windows-x86-mingw492-5.6.0.exe。一切都在編譯。然而,聯產生以下錯誤:鏈接Qt5.6產生錯誤沒有找到需要的參考

C:/sofit/inuit_workspace/inuit_development/tools/makefiles/inuit/MakefileCatenaISS.mk:145: recipe for target 'build/model/model.exe' failed

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:175: undefined reference to `_imp___ZN12QApplicationC1ERiPPci'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:176: undefined reference to `_imp___ZN7QWidgetC1EPS_6QFlagsIN2Qt10WindowTypeEE'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:180: undefined reference to `_imp___ZN7QWidget4showEv'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:181: undefined reference to `_imp___ZN12QApplication4execEv'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:307: undefined reference to `_imp___ZN12QApplicationD1Ev'

C:/sofit/inuit_workspace/inuit_development/tools/inuit/inuit.cpp:307: undefined reference to `_imp___ZN12QApplicationD1Ev'

collect2.exe: error: ld returned 1 exit status

make: *** [build/model/model.exe] Error 1

我用下面的命令鏈接:

C:\Qt\Qt5.6.0\Tools\mingw492_32\bin\g++.exe -g 
-LC:\Qt\Qt5.6.0\5.6\mingw49_32\lib -lQt5Widgets -lQt5Core -lQt5Gui -lQt5Cored -lQt5Guid -lQt5Widgetsd -lqtmain -lqtmaind -o build/model/model.exe ./build/model/objects/a.obj ./build/model/objects/b.obj 

我已經添加了一堆庫和各種組合。單獨使用Widgets,Core和Gui也無法做到這一點。在相關問題回答中確定

潛在原因(見下文),旨在 - 不匹配架構的lib /編譯 - 缺少-lQt5Widgets

不過,我不認爲這也適用於這裏。請注意,我沒有使用CMake或QMake(因此沒有.pro文件或CMake文件) - 只是在Eclipse Mars內調用Gnu make。

源(如有興趣):

int main(int argc, char *argv[]) 
    QApplication app(argc, argv); 
    QWidget *widget = new QWidget; 
    Ui_MainWindow ui; 
    widget->show(); 
    return app.exec(); 
} 

,編譯器指令(如有興趣):

C:\Qt\Qt5.6.0\Tools\mingw492_32\bin\g++.exe -IC:\Qt\Qt5.6.0\5.6\mingw49_32\include -IC:/my_project -Wall -g -c -DWIN32 -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT C:/my_project/1.cpp -o C:/my_project/build/model/objects/1.obj 

我和/試過沒有Qt的符號。

有誰知道可能是什麼問題?

相關:

任何幫助是非常appre ciated。

+0

您可能需要對「mkspecs」進行反向工程,以根據您的平臺找到正確的標誌 – Mozfox

+0

至少,您不應該同時連接調試和發佈庫。根據你的需要選擇一個。 –

回答

1

有恰恰是得到它不會浪費了大量的時間工作的一種方式:

  1. 使用qmake將產生一個Makefile爲你的項目。

  2. 確保它建立。

  3. 如果需要,根據需要清理Makefile。

你當然可以隨時使用qmake隨時更新Makefile,無論何時更改源代碼。你會發現主要的事情是手動維護makefile是一件非常痛苦的事情,因爲你還需要維護依賴項列表,並且需要遞歸掃描每個翻譯單元包含的文件。換句話說,無論你自己想出什麼Makefiles,都不會在修改項目時正確地重建項目。因此,您將在開發過程中放棄Makefile的好處。大多數手工生成的Makefile非常缺乏每個源文件的適當依賴關係 - 因爲沒有人會自動維護它,並且一旦你自動維護它,你不妨使用qmake或cmake來完成這項工作。

最後,沒有Qt這樣的東西沒有qmake,所以不使用qmake是愚蠢的。如果你依賴於Qt,那麼假裝qmake不在那裏,你不會輕易做出任何事情:你的項目將使用Qt提供的許多其他二進制工具,因此給qmake一個特殊的地位只會浪費你的時間。如果你的項目規模很大,那麼你可以通過使用cmake和Ninja生成器來節省大量的編譯時間,因爲qmake目前正在生成遞歸的Makefiles,並且這導致了糟糕的構建性能。

+0

感謝您的回覆。我完全同意你自動生成makefile文件。 Qt gui應該集成到一個基於手動編輯的makefile的現有系統中,這個makefiles會隨着時間的推移組合多個構建系統,即將所有的控制權交給qmake將會產生相當大的努力。但是,這就是我要開始的地方:不知怎的,使用Qt來編譯某個東西,然後從中取出。 –

+0

您不需要對qmake進行任何控制。使用qmake生成一次Makefile。然後你就完成了。將該Makefile添加到項目中,並隨意對其進行編輯以簡化它。然後保證您有一個已知的工作起點。 –