Qt. Ошибка копирования файла при попытке запустить проект. Как исправить ошибку и почему это происходит?

Я пытаюсь установить и создать первый проект Qt. Я использую CLion с CMake и Qt 6. Я установил 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()
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()

Собственно, именно так он был сгенерирован при создании проекта CLion. Я только установил путь: D:/Qt/6.0.2/mingw81_64/lib/cmake

На всякий случай еще добавлю код main.c. Он также генерируется 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();
}

Проблем с CMake не вижу, но при попытке запустить проект выдает ошибку:

      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

Что это за ошибка и как ее исправить? Я так понимаю, со сборкой проблем нет - только ошибка копирования. И должна ли скопированная dll называться «Ядро», а не «Ядро»?

Спасибо за Ваше внимание! Если вам понадобится дополнительная информация, дайте мне знать - я постараюсь уточнить вопрос.

3 ответа

Задача решена. Полезно ли это кому-либо, но CMake, автоматически сгенерированный CLion, содержит строки, вызывающие ошибку в режиме отладки (добавляет суффикс 'd' ко всем файлам dll):

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

Удаление этих строк спасло меня :)

Реальный ответ на это заключается в том, что вы используете профиль CMake, определенный как «отладка», в то время как вы не установили отладочную версию Qt.

Чтобы решить, а не исправлять, если вы не хотите загружать отладочные библиотеки DLL, создайте профиль CMake для «выпуска».

У меня была такая же проблема, и ни один из ответов здесь не решил проблему. Вот как я мог решить это для себя:

TL;DR:

  1. установить префикс-путь при создании проекта
  2. скопируйте недостающую Qt6Cored.dll в папку bin

При создании нового проекта в Clion обязательно укажите правильный префикс-путь:

Вы можете видеть в своем сообщении об ошибке, что /bin/Qt6Cored.dll автоматически добавляется к пути префикса, поэтому вам не нужно выбирать папку bin при установке пути префикса.

После этого я все еще получал сообщение об ошибке (но путь отображался правильно без каких-либо «/../..»).

Затем я понял, что в моей папке bin нет библиотеки Qt6Cored.dll:

Поэтому я просто скопировал недостающий файл из C:\Qt\6.1.3\msvc2019_64\bin в C:\Qt\6.1.3\mingw81_64\bin

И тогда это сработало!

Если у вас нет папки msvc2019_64, вы можете установить ее, изменив Qt через настройки приложения:

Другие вопросы по тегам