Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Can't compile project using CLion and CMake



  • Hello, Qt community!
    I’m new to programming, especially in Qt. So please don’t swear if I write anything stupid.
    Now I’m trying to install and create the first Qt project. I am using CLion with CMake and Qt 6.
    I set up CMake:

    cmake_minimum_required(VERSION 3.17)
    project(QSnake)
    
    set(CMAKE_CXX_STANDARD 20)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_AUTOUIC ON)
    
    set(QT_VERSION 6)
    set(REQUIRED_LIBS Core Gui Widgets)
    set(REQUIRED_LIBS_QUALIFIED Qt6::Core Qt6::Gui Qt6::Widgets)
    
    set(CMAKE_PREFIX_PATH D:/Qt/6.0.2/mingw81_64/lib/cmake)
    
    add_executable(${PROJECT_NAME} main.cpp)
    
    if(NOT CMAKE_PREFIX_PATH)
        message(WARNING "CMAKE_PREFIX_PATH is not defined, you may need to set it "
                        "(-DCMAKE_PREFIX_PATH=\"path/to/Qt/lib/cmake\" or -DCMAKE_PREFIX_PATH=/usr/include/{host}/qt{version}/ on Ubuntu)")
    endif()
    #D:\Qt\6.0.2\mingw81_64\lib\cmake
    find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
    target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED})
    if(WIN32)
        set(DEBUG_SUFFIX)
        if (CMAKE_BUILD_TYPE MATCHES "Debug")
            set(DEBUG_SUFFIX "d")
        endif()
        set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
        if(NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
            if(NOT EXISTS "${QT_INSTALL_PATH}/bin")
                set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
            endif()
        endif()
        if(EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E make_directory
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        endif()
        foreach(QT_LIB ${REQUIRED_LIBS})
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    "${QT_INSTALL_PATH}/bin/Qt${QT_VERSION}${QT_LIB}${DEBUG_SUFFIX}.dll"
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
        endforeach(QT_LIB)
    endif()
    

    Actually, this is how it was generated when the CLion project was created. I only set the path: D:/Qt/6.0.2/mingw81_64/lib/cmake

    Just in case, I will also add the main.c code. It is also generated by CLion.

    #include <QApplication>
    #include <QPushButton>
    
    int
    main(int argc,
         char *argv[])
    {
        QApplication a(argc, argv);
        QPushButton button("Hello world!", nullptr);
        button.resize(200, 100);
        button.show();
        return QApplication::exec();
    }
    

    I don’t see any problems with CMake, but when I try to run the project there is an error:

    Error copying file "D:/Qt/6.0.2/mingw81_64/lib/cmake/../../bin/Qt6Cored.dll" to "D:/QSnake/cmake-build-debug".
    mingw32-make[3]: *** [CMakeFiles\QSnake.dir\build.make:126: QSnake.exe] Error 1
    mingw32-make[3]: *** Deleting file 'QSnake.exe'
    mingw32-make[2]: *** [CMakeFiles\Makefile2:96: CMakeFiles/QSnake.dir/all] Error 2
    mingw32-make[1]: *** [CMakeFiles\Makefile2:103: CMakeFiles/QSnake.dir/rule] Error 2
    mingw32-make: *** [Makefile:137: QSnake] Error 2
    

    Can you please tell me what this is about? I guess I haven’t set something up or pointed out a way?


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    @mingvv said in Can't compile project using CLion and CMake:

    Qt6Cored.dll

    Where do you have that file in your Qt 6 installation ?



  • Problem solved.
    Whether it is useful to anyone, but the CMake automatically generated by CLion contains rows that cause an error in debug mode (adds 'd' suffix to all dll files):

    if (CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "d")
    endif()
    

    Deleting those lines saved me :)



  • @mingvv during debug it will link with debug version of the dll.
    eg:QtCored.dll


  • Lifetime Qt Champion

    @mingvv said in Can't compile project using CLion and CMake:

    Deleting those lines saved me :)

    I don't see why this would help anything.



  • @nagesh Maybe I don't have debug dll?


  • Lifetime Qt Champion

    Since you can't mix (msvc) / should not (mingw) debug and release libs it's dangerous to use Qt release dlls with a debug build of your program.
    And this strang install stuff is not needed at all - use windeployqt



  • @Christian-Ehrlicher said in Can't compile project using CLion and CMake:

    Since you can't mix (msvc) / should not (mingw) debug and release libs it's dangerous to use Qt release dlls with a debug build of your program.

    Where can I get debug dll files? I reinstalled Qt, but it didn’t help. Are they at another address?

    @Christian-Ehrlicher said in Can't compile project using CLion and CMake:

    And this strang install stuff is not needed at all - use windeployqt

    What does it do? This utility helps configure Qt for Windows?

    And then there’s the question. Can I run Qt project (CMake) using Visual Studio?


  • Lifetime Qt Champion

    @mingvv said in Can't compile project using CLion and CMake:

    What does it do?

    It deploys Qt applications. See https://doc.qt.io/qt-5/windows-deployment.html

    Qt debug libs are installed together with release libs if you use Qt Online Installer/Maintenance Tool.



  • @jsulm Yes, but using QtCreator I can simply build and launch the project during the development phase. With other IDE to build Qt I cannot. So I’m not sure if this windeployqt.exe is what I need. Maybe I just don’t understand why I need to... But my current goal is simply to build a project using at least Visual Studio.


  • Lifetime Qt Champion

    @mingvv said in Can't compile project using CLion and CMake:

    With other IDE to build Qt I cannot

    OK, then this is indeed another issue.
    If you're using Visual Studio then this line is wrong:

    set(CMAKE_PREFIX_PATH D:/Qt/6.0.2/mingw81_64/lib/cmake)
    

    It should point to Qt for Visual Studio, not for MinGW.



  • @jsulm said in Can't compile project using CLion and CMake:

    @mingvv said in Can't compile project using CLion and CMake:

    With other IDE to build Qt I cannot

    OK, then this is indeed another issue.
    If you're using Visual Studio then this line is wrong:

    set(CMAKE_PREFIX_PATH D:/Qt/6.0.2/mingw81_64/lib/cmake)
    

    It should point to Qt for Visual Studio, not for MinGW.

    I only have this folder. Using MaintenanceTool.exe I also don't see separate components for MSVC.

    I used CMake GUI app to generate projects and solution (.sln), but while trying to compile I have 18 errors in library files. Is that why I have MinGW in CMake?


  • Lifetime Qt Champion

    @mingvv said in Can't compile project using CLion and CMake:

    Using MaintenanceTool.exe I also don't see separate components for MSVC

    You should. You could try to reinstall Qt.



  • @jsulm
    Indeed, it has now been possible to install the MSVC version. I have upgraded CMake, but this has not corrected the bugs in the project build:

    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QString::~QString(void)" (__imp_??1QString@@QEAA@XZ) referenced in function main
    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QString::QString(char const *)" (__imp_??0QString@@QEAA@PEBD@Z) referenced in function main
    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QApplication::QApplication(int &,char * *,int)" (__imp_??0QApplication@@QEAA@AEAHPEAPEADH@Z) referenced in function main
    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl QApplication::~QApplication(void)" (__imp_??1QApplication@@UEAA@XZ) referenced in function main
    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static int __cdecl QApplication::exec(void)" (__imp_?exec@QApplication@@SAHXZ) referenced in function main
    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __cdecl QWidget::show(void)" (__imp_?show@QWidget@@QEAAXXZ) referenced in function main
    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __cdecl QWidget::resize(int,int)" (__imp_?resize@QWidget@@QEAAXHH@Z) referenced in function main
    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QPushButton::QPushButton(class QString const &,class QWidget *)" (__imp_??0QPushButton@@QEAA@AEBVQString@@PEAVQWidget@@@Z) referenced in function main
    2>main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl QPushButton::~QPushButton(void)" (__imp_??1QPushButton@@UEAA@XZ) referenced in function main
    2>main.obj : error LNK2001: unresolved external symbol "public: virtual __cdecl QApplication::~QApplication(void)" (??1QApplication@@UEAA@XZ)
    2>main.obj : error LNK2001: unresolved external symbol "public: virtual __cdecl QPushButton::~QPushButton(void)" (??1QPushButton@@UEAA@XZ)
    2>main.obj : error LNK2001: unresolved external symbol "public: __cdecl QString::~QString(void)" (??1QString@@QEAA@XZ)
    2>D:\QSnake\RelWithDebInfo\QSnake.exe : fatal error LNK1120: 12 unresolved externals
    

  • Lifetime Qt Champion

    @mingvv Did you try a complete rebuild?



  • @jsulm Yes, I cleaned solution and rebuilt. Maybe I generated it wrong with CMake? Is there any build guide for Visual Studio or any hidden features?


  • Lifetime Qt Champion

    And make sure that the msvc libs are used during linking.



  • Maybe I should add project additional include directories?

    @Christian-Ehrlicher said in Can't compile project using CLion and CMake:

    And make sure that the msvc libs are used during linking.

    How can I check it? I guess I have default settings, because I didn't change them.

    P.S. Maybe you know, after how many messages can I post more than once in 10 minutes?


  • Lifetime Qt Champion

    @mingvv said in Can't compile project using CLion and CMake:

    How can I check it?

    Since you've a msvc project take a look in the linker options. Or use cmake-gui to see the CMake values.



  • @Christian-Ehrlicher If I correctly understood you, I use MSVC linker:
    CMAKE_LINKER - C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.28.29910/bin/Hostx64/x64/link.exe


  • Lifetime Qt Champion

    I don't care about the linker but about the input for it - do you link against the QtWidget dll for msvc?



  • Finally solved the problem... The reason turned out to be very stupid - CMake was not specified by MSVC, but by MinGW library and the wrong solution was generated.
    However, in debug version still does not work (now builds only in release) because dll files with suffix "d" are not included. Should they be installed as separate components? They’re not in the bin directory where exist release dlls.



  • I found that I have debug dll files in the MSVC directory, but in the MinGW directory there are only release dlls. This causes bugs in debugging. Do you have files with the "d" suffix in the MinGW directory?



  • @mingvv mingw bin directory is having both release and debug version (with d suffix) of dlls.



  • @nagesh said in Can't compile project using CLion and CMake:

    @mingvv mingw bin directory is having both release and debug version (with d suffix) of dlls.

    Thank you for the answer!
    Did you install them separately (I mean, there is a separate item in the installer? If so, what is it called?)?


  • Lifetime Qt Champion

    @mingvv said in Can't compile project using CLion and CMake:

    Did you install them separately

    Do you mean release and debug? No, those are both installed by default.



  • @jsulm said in Can't compile project using CLion and CMake:

    @mingvv said in Can't compile project using CLion and CMake:

    Did you install them separately

    Do you mean release and debug? No, those are both installed by default.

    Yes. I reinstalled Qt, but debug files never appeared for MinGW (with MSVC all OK). "Qt Debug Information" is not that?


  • Lifetime Qt Champion

    @mingvv said in Can't compile project using CLion and CMake:

    but debug files never appeared for MinGW

    That's strange. On my machine I have both. How did you install Qt and what version?



  • @jsulm said in Can't compile project using CLion and CMake:

    @mingvv said in Can't compile project using CLion and CMake:

    but debug files never appeared for MinGW

    That's strange. On my machine I have both. How did you install Qt and what version?

    Using Qt Online Installer for Windows I installed the default set for Qt 6 as well as an additional component for MSVC.
    What I have now (as it looks in MaintenanceTool):
    *) Qt -> Qt 6.0.2 -> MSVC 2019 64-bit
    *) Qt -> Qt 6.0.2 -> MinGW 8.1.0 64-bit
    *) Qt -> Developer and Designer Tool -> Qt Creator 4.14.1 CDB Debugger Support
    *) Qt -> Developer and Designer Tool -> Debugging Tools for Windows
    *) Qt -> Developer and Designer Tool -> MinGW 8.1.0 64-bit
    *) Qt -> Developer and Designer Tool -> CMake 3.19.2 64-bit
    *) Qt -> Developer and Designer Tool -> Ninja 1.10.0


  • Lifetime Qt Champion

    @mingvv I did not yet install Qt6, maybe something is different there.



  • @jsulm said in Can't compile project using CLion and CMake:

    @mingvv I did not yet install Qt6, maybe something is different there.

    You’re using version 5? Honestly, I don’t know why I put 6. I decided that the new and apparently more active development of it. Are there any significant differences? Otherwise, I would have reassigned to 5.


  • Lifetime Qt Champion

    @mingvv said in Can't compile project using CLion and CMake:

    Are there any significant differences?

    Yes, currently not all Qt modules are available in Qt6 and will be added in later Qt6 releases. It is save to stay with Qt5 for now.



  • @jsulm said in Can't compile project using CLion and CMake:

    @mingvv said in Can't compile project using CLion and CMake:

    Are there any significant differences?

    Yes, currently not all Qt modules are available in Qt6 and will be added in later Qt6 releases. It is save to stay with Qt5 for now.

    I reinstalled to version 5. Still debug dlls are only for MSVC... Are you sure there’s no need to add an extra component in installer or something else? Otherwise I don’t know what it is and why it don't install debug libraries for MinGW.


  • Moderators

    @mingvv said in Can't compile project using CLion and CMake:

    I reinstalled to version 5. Still debug dlls are only for MSVC... Are you sure there’s no need to add an extra component in installer or something else? Otherwise I don’t know what it is and why it don't install debug libraries for MinGW.

    We don't ship pure debug libraries anymore for MinGW, since Qt 5.15.0 (IIRC). Instead, there's a package with additional debug information for the release binaries. This is the same approach we're actually using also on macOS and Linux; it's only Windows MSVC where you need completely different builds (due to the different MSVC runtimes used for debug and release builds).



  • @kkoehne said in Can't compile project using CLion and CMake:

    @mingvv said in Can't compile project using CLion and CMake:

    I reinstalled to version 5. Still debug dlls are only for MSVC... Are you sure there’s no need to add an extra component in installer or something else? Otherwise I don’t know what it is and why it don't install debug libraries for MinGW.

    We don't ship pure debug libraries anymore for MinGW, since Qt 5.15.0 (IIRC). Instead, there's a package with additional debug information for the release binaries. This is the same approach we're actually using also on macOS and Linux; it's only Windows MSVC where you need completely different builds (due to the different MSVC runtimes used for debug and release builds).

    What is the package?


  • Moderators

    a16fc441-c64a-413b-a284-b3ba629b5374-grafik.png



  • Thank you to all the panellists, I’ll take care of it.
    Can we leave it open in case there are any mistakes or questions?