Неопределенные ссылки Qt5 в C++ с использованием CMake (mingw) в Windows с CLion

Я пытаюсь изучить Qt5 с помощью CMake в новом CLion C/C++ IDE, я относительно новичок в этих инструментах. Итак, у меня есть этот действительно простой код main.cpp:

#include <QDebug>
int main() {
    qDebug("Hello World!");
    return 0;
}

Я следовал документации и закончил с этим CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.11)
project(cl_hello_world2)

set(CMAKE_PREFIX_PATH D:/Qt/Qt5.4.0/5.4/msvc2012_opengl)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_VERBOSE_MAKEFILE ON)

find_package(Qt5Widgets)

set(SOURCE_FILES main.cpp)
add_executable(cl_hello_world2 WIN32 ${SOURCE_FILES})

target_link_libraries(cl_hello_world2 Qt5::Widgets)

После многих часов попыток у меня продолжают появляться эти undefined reference ошибки:

CMakeFiles\cl_hello_world2.dir/objects.a(main.cpp.obj): In function `main':
E:/Qt/test/cl-hello-world2/main.cpp:4: undefined reference to `_imp___ZNK14QMessageLogger5debugEPKcz'

Это команда компилятора, которую выполняет CMake:

D:\PROGRA~2\CODEBL~1\MinGW\bin\G__~1.EXE   -std=c++11 -g    -mwindows -Wl,--whole-archive CMakeFiles\cl_hello_world2.dir/objects.a -Wl,--no-whole-archive  -o cl_hello_world2.exe -Wl,--out-implib,libcl_hello_world2.dll.a -Wl,--major-image-version,0,--minor-image-version,0  D:\Qt\Qt5.4.0\5.4\msvc2012_opengl\lib\Qt5Widgetsd.lib D:\Qt\Qt5.4.0\5.4\msvc2012_opengl\lib\Qt5Guid.lib D:\Qt\Qt5.4.0\5.4\msvc2012_opengl\lib\Qt5Cored.lib D:\Qt\Qt5.4.0\5.4\msvc2012_opengl\lib\qtmaind.lib -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32

Я не знаю, корректна ли эта строка синтаксически, но библиотека D:\Qt\Qt5.4.0\5.4\msvc2012_opengl\lib\Qt5Widgetsd.lib существует...

Я пробовал с Qt5.3.2 и Qt 5.4.0. Может быть вы знаете какой-то другой способ добавить библиотеку для линковки, а может я ошибся...

Спасибо.


person lmiguelmh    schedule 04.02.2015    source источник
comment
Вы не можете использовать двоичные файлы Visual Studio для mingw. Используйте сборку mingw Qt.   -  person drescherjm    schedule 05.02.2015
comment
Ой ну спасибо! Я этого не заметил ... Я поищу эту сборку mingw Qt   -  person lmiguelmh    schedule 05.02.2015
comment
@drescherjm, пожалуйста, добавьте свой комментарий в качестве ответа, и я приму его ... возможно, я добавлю некоторые изменения в ваш ответ, чтобы прояснить некоторые проблемы, которые у меня были. Большое спасибо.   -  person lmiguelmh    schedule 06.02.2015


Ответы (1)


Ваша проблема в том, что вы пытаетесь использовать сборку Qt для Visual Studio с mingw. Вам нужно использовать сборку mingw для Qt.

Изменить

  1. Если вы собираетесь использовать MinGW, загрузите нужную версию Qt по адресу http://www.qt.io/download-open-source/ Qt 5.4.0 для 32-разрядной версии Windows (MinGW 4.9.1, 852 МБ). В момент установки не забудьте выбрать компонент MinGW 4.9.1.

  2. Выполните этот шаг, если вы собираетесь использовать CLion: в File: Settings или Ctrl + Alt + S выберите правильный путь к MinGW, как показано:

Конфигурация цепочки инструментов CLion

  1. В CMakeLists.txt измените строку: set(CMAKE_PREFIX_PATH D:/Qt/Qt5.4.0/5.4/msvc2012_opengl) на то, где находится ваш путь Qt: set(CMAKE_PREFIX_PATH D:/Qt/Qt5.4.0MinGw/5.4/mingw491_32)

  2. Теперь, если вы скомпилируете и запустите из IDE, вы получите ошибку: Process finished with exit code -1073741515 (0xC0000135). Вам нужны библиотеки Qt на вашем пути или в каталоге, где находится ваш exe. Мне пришлось скопировать icudt53.dll icuin53.dll icuuc53.dll libgcc_s_dw2-1.dll libstdc++-6.dll libwinpthread-1.dll Qt5Cored.dll Qt5Guid.dll Qt5Widgetsd.dll в свой каталог («d» для «отладки»).

  3. Если вы запустите этот пример кода для начинающих пользователей Qt из CLion, вы получите это!

Запуск Qt MinGW и CMake из CLion

Что касается моего исходного кода, я не понимаю, что происходит, но я не могу понять, почему qDebug не печатает в stdout...

person drescherjm    schedule 05.02.2015
comment
для пояснения: qDebug не выводится на стандартный вывод, потому что это не консольное приложение, см. add_executable(cl_hello_world2 WIN32 ${SOURCE_FILES}) метка WIN32 определена для неконсольных приложений - person lmiguelmh; 31.07.2015