make
を実行してcmake
で生成されたMakefileをコンパイルしたとき、Qt5アプリケーションのhello worldの例をコンパイルすると、次のエラー: MinGW-w64を使用してWindows上でQt5 hello world .cppファイルをコンパイルすると "未定義の参照"エラーが発生する
はなぜコンパイルが失敗していますか? Qt official websiteからダウンロードQt5.5バイナリを使用して、私は、Windows 10の下だ
を
(私がフォローをやろうとしているまさにの詳細)、mingwの-W64 gcc
とg++
に同梱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に報告するが、そこに理由が存在する場合とは異なるように見えました。
正式なQt-5.5のダウンロードには、64ビットのコンパイル済みバイナリが含まれていますか?私は彼らがmingwのために32ビットのバイナリしか提供していないと思った。 – drescherjm
@drescherjmありがとう、私はQt5の32ビット版を持っている可能性を考えなかった。それが問題になるかもしれません。 Qtのフォルダーツリーの下には 'mingw492_32'フォルダーがあります。これは実際にはQtの32ビットディストリビューションがあることを意味します(gccとg ++はこのフォルダーの下では動作しません)。 Qtがコンパイルされたアーキテクチャーを簡単に確認する方法を知っていますか? – glS
あなたのアプリケーションに使用したいコンパイラで 'Qt'自体をビルドします。 Qtをビルドするのに1時間かかります。設定が難しいことではありません。作成するにはPython、Perl、Rubyが必要です。私はPerlとPythonのActiveStateバージョンとrubyinstallerのRubyを使用しています。 – drescherjm