2016-06-28 7 views
1

makeを実行してcmakeで生成されたMakefileをコンパイルしたとき、Qt5アプリケーションのhello worldの例をコンパイルすると、次のエラー: MinGW-w64を使用してWindows上でQt5 hello world .cppファイルをコンパイルすると "未定義の参照"エラーが発生する

enter image description here

はなぜコンパイルが失敗していますか? Qt official websiteからダウンロードQt5.5バイナリを使用して、私は、Windows 10の下だ


(私がフォローをやろうとしているまさにの詳細)、mingwの-W64 gccg++に同梱WinBuilds、およびcmake v3.6がofficial websiteからダウンロードされ、Windows win64-x64 Installerとインストールされています。

#include <QCoreApplication> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication app (argc, argv); 

    return app.exec(); 
} 

のMakefileが正常に.cppファイルを含むディレクトリ内buildというフォルダからコマンドcmake -G "MinGW Makefiles" ..を使用して構築されています:Qt5's official wikiで提供私は、次のHello Worldのテストファイルをコンパイルしようとしている

、 。以下CMakeLists.txt(このSO postで説明した例と同様に必要とされるCMAKE_PREFIX_PATH変数の指定、を添加して、Qt5's cmake wiki pageから採取された)ファイルを使用した:

cmake_minimum_required(VERSION 2.8.11) 

SET(CMAKE_C_COMPILER C:/WinBuilds/bin/x86_64-w64-mingw32-gcc-4.8.3.exe) 
SET(CMAKE_CXX_COMPILER C:/WinBuilds/bin/x86_64-w64-mingw32-g++-4.8.3.exe) 

project(testproject) 

set(CMAKE_INCLUDE_CURRENT_DIR ON) 
set(CMAKE_AUTOMOC ON) 
#set(CMAKE_PREFIX_PATH "C:/WinBuilds/lib64/cmake") 
set(CMAKE_PREFIX_PATH "C:/Qt/5.5/mingw492_32/lib/cmake") 

find_package(Qt5Widgets) 

add_executable(testfile WIN32 test.cpp) 

target_link_libraries(testfile Qt5::Widgets) 

(私はcmakeのを使用しませんでしたQt5に同梱されていたので動作しませんでした)。

ここで問題は、cmakeによって作成されたMakefileでmake(正確には、mingw32-make、WinBuildsとともに出荷)を実行したときに発生します。私はこれを行うと は、コンパイルは(同じものは上のスクリーンショットで示した)、次のエラーで失敗します

CMakeFiles\testfile.dir/objects.a(test.cpp.obj):test.cpp:(.text+0x35): undefined reference to `__imp__ZN16QCoreApplicationC1ERiPPci' 
CMakeFiles\testfile.dir/objects.a(test.cpp.obj):test.cpp:(.text+0x3e): undefined reference to `__imp__ZN16QCoreApplication4execEv' 
CMakeFiles\testfile.dir/objects.a(test.cpp.obj):test.cpp:(.text+0x50): undefined reference to `__imp__ZN16QCoreApplicationD1Ev' 
CMakeFiles\testfile.dir/objects.a(test.cpp.obj):test.cpp:(.text+0x67): undefined reference to `__imp__ZN16QCoreApplicationD1Ev' 
c:/winbuilds/bin/../lib64/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\testfile.dir/objects.a(test.cpp.obj): bad reloc address 0xc in section `.xdata' 
c:/winbuilds/bin/../lib64/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: final link failed: Invalid operation 
collect2.exe: error: ld returned 1 exit status 
CMakeFiles\testfile.dir\build.make:127: recipe for target 'testfile.exe' failed 
mingw32-make[2]: *** [testfile.exe] Error 1 
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/testfile.dir/all' failed 
mingw32-make[1]: *** [CMakeFiles/testfile.dir/all] Error 2 
Makefile:82: recipe for target 'all' failed 
mingw32-make: *** [all] Error 2 

なぜコンパイルが失敗していますか?

類似未定義参照エラーは、この他のSO questionに報告するが、そこに理由が存在する場合とは異なるように見えました。

+0

正式なQt-5.5のダウンロードには、64ビットのコンパイル済みバイナリが含まれていますか?私は彼らがmingwのために32ビットのバイナリしか提供していないと思った。 – drescherjm

+0

@drescherjmありがとう、私はQt5の32ビット版を持っている可能性を考えなかった。それが問題になるかもしれません。 Qtのフォルダーツリーの下には 'mingw492_32'フォルダーがあります。これは実際にはQtの32ビットディストリビューションがあることを意味します(gccとg ++はこのフォルダーの下では動作しません)。 Qtがコンパイルされたアーキテクチャーを簡単に確認する方法を知っていますか? – glS

+0

あなたのアプリケーションに使用したいコンパイラで 'Qt'自体をビルドします。 Qtをビルドするのに1時間かかります。設定が難しいことではありません。作成するにはPython、Perl、Rubyが必要です。私はPerlとPythonのActiveStateバージョンとrubyinstallerのRubyを使用しています。 – drescherjm

答えて

2

問題は、64ビットQtアプリケーションをビルドしようとしているときに、32ビットmingwコンパイル済みQtバイナリを使用していることです。これを行うには、mingwでコンパイルされた64ビットQtバイナリを使用する必要があります。

+0

これに加えて、私は[Qt wiki](https://wiki.qt.io/index.php?title=MinGW)で提供されているmingw64のバイナリを使ってこの作業を行いました-64-bit&oldid = 23929)。より具体的には、ここでQt 5.6のバイナリをダウンロードしてください:https://dl.dropboxusercontent.com/u/27566023/Software%20Host/qt-5.6-mingw64.7z。また、WinBuilds自体がQt 5.3用の64ビットバイナリで出荷されていることに気がつきましたが、何らかのバグ(参照問題)のために動作しないようです。 – glS

関連する問題