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:
- установить префикс-путь при создании проекта
- скопируйте недостающую 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 через настройки приложения: