c++ - 为什么 CLion 可以正确构建和链接 Qt,但不能运行我的可执行文件?
问题描述
概括
我正在尝试在 Windows 上的 Clion 中编译和运行/调试 Qt 代码。CMake 和构建过程都没有返回错误。
会出现以下情况:
当我尝试跑步时,我得到
Process finished with exit code -1073741511 (0xC0000139)
当我尝试调试时,我得到
Process finished with exit code 1
当我尝试直接通过 Windows CMD 运行可执行文件时,可执行文件按预期运行。
当我将所有 dll 文件从项目文件夹复制
../Qt/5.12.6/mingw73_64/bin
到项目cmake-build-debug
文件夹时,可执行文件会按预期在 CLion 中运行和调试。
我的设置
- 视窗 10
- Qt 5.12.6(mingw73_64 构建)
- 克莱恩 2019.2.5
- MinGW (x86_64-8.1.0-win32-seh-rt_v6_rev0)
- CMake(捆绑,3.15.3)
其他发现
我相信 StackOverflow 上有很多相关主题都在处理同样的问题。但没有人能够为我认为是路径/环境问题提供明确的答案。许多建议归结为“将 Qt 添加到您的路径/PATH/Path 环境变量并重新启动重新启动!”,和/或主要与 linux 安装有关。因此,我希望对于在这种情况下遇到相同错误代码的人来说,这成为一个更完整的问题和答案,因为它可能与同一问题有关。
由于事情在 CLion 之外工作(如 (3) 所示)并且在我复制 DLL (4) 时在 CLion 内部工作,我相信由于 CLion 相关的环境问题,我正在处理动态链接问题。将 Qt bin 文件夹添加C:\Qt\5.12.6\mingw73_64\bin
到我的System Environment Variables
制作中,这样我就可以直接从 CMD 运行 exe 文件。请注意,我将 Qt bin 文件夹路径添加到Path
变量中。
鉴于网上有人提到,由于 CLion 以某个系统用户身份运行,可能是用户变量的问题,所以我也将所说的路径添加为User Environment Variable
, 再次Path
。可惜。
此外,我尝试通过Settings -> Appearance & Behavior -> Path Variables
. 在这里,我尝试将 Qt bin 文件夹分别映射到Path
、PATH
和QT_DIR
。即使我尝试了多次重新启动,仍然没有成功。在更改路径等之间多次尝试 Windows 重新启动和真正关闭。
主要问题:
如何解决我描述的问题,以便我可以在 CLion 中运行和调试我的 Qt 构建,而无需将 Qt 相关的 DLL 复制到cmake-build-debug
可执行文件所在的位置。
CMakeLists.txt
在Settings -> Build, Execution, Deployment -> CMake
我设定的范围CMake options:
内-DCMAKE_PREFIX_PATH=C:\\Qt\\5.12.6\\mingw73_64\\lib\\cmake
cmake_minimum_required(VERSION 3.8)
project(HelloWorld)
set(CMAKE_CXX_STANDARD 14)
# Include a library search using find_package()
# via REQUIRED, specify that libraries are required
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Widgets REQUIRED)
set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
# specify which libraries to connect
target_link_libraries(${PROJECT_NAME} Qt5::Core)
target_link_libraries(${PROJECT_NAME} Qt5::Gui)
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)
主文件
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QLabel>
int main (int argc, char * argv []) {
QApplication app (argc, argv);
QWidget widget;
widget.resize (640, 480);
widget.setWindowTitle ("Hello, world !!!");
QGridLayout * gridLayout = new QGridLayout (& widget);
QLabel * label = new QLabel ("Hello, world !!!");
label-> setAlignment (Qt :: AlignVCenter | Qt :: AlignHCenter);
gridLayout-> addWidget (label);
widget.show ();
return app.exec ();
}
解决方案
推荐阅读
- python - AWS Lambda 从 Codepipeline 调用权限被拒绝错误
- javascript - 文字本身不会加粗
- vb.net - VB.NET:如何在将标签定义为变量时仅从标签中获取数值
- javascript - Javascript,HTML:设置网页移动到 about:blank 页面并禁用返回(杀死页面)
- reactjs - 不推荐使用 btoa 时如何在 ReactJS 中编码 base 64 字符串?
- powershell - 远程访问 DC 安全事件完整数据
- angular - 来自对象数组的角度显示表数据,但从另一个 API 调用更新最后一列返回未定义的值
- reactjs - 无法从 VS Code 运行 Android 模拟器
- zsh - 是否可以在 TIG 中直接从键绑定中搜索特定字符串?
- python - 如何使用唯一索引索引列表中的每个元素