Недефинирани 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)


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

Редактиране

  1. Ако ще използвате MinGW, изтеглете правилната версия на Qt от http://www.qt.io/download-open-source/ Qt 5.4.0 за Windows 32-bit (MinGW 4.9.1, 852 MB). В момента на инсталиране не забравяйте да изберете компонент MinGW 4.9.1.

  2. Следвайте тази стъпка, ако ще използвате CLion: Във Файл: Настройки или Ctrl + Alt + S изберете правилния път на MinGW, както е показано:

Конфигурация на CLion toolchain

  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" е за "debug").

  3. Ако стартирате този примерен код за Qt начинаещи от CLion, ще получите това!

Стартиране на Qt MinGW и CMake от CLion

Относно моя първоначален код, не разбирам какво се случва, но не мога да разбера защо qDebug не отпечатва в stdout...

person drescherjm    schedule 05.02.2015
comment
за пояснение: qDebug не отпечатва в stdout, защото това не е конзолно приложение, вижте add_executable(cl_hello_world2 WIN32 ${SOURCE_FILES}) етикетът WIN32 е дефиниран за неконзолни приложения - person lmiguelmh; 31.07.2015