title | date | updated |
---|---|---|
WINDOWS_MSVC_MinGW & LINUX_GCC & MACOS_CLANG 所遇到奇葩问题集锦 |
2023-05-01 05:22:28 -0700 |
2023-06-29 09:34:28 -0700 |
目录
[toc]
最开始,都是在 Linux 上开发:UOS/Deepin, Ubuntu,ArchLinux;后来喜欢 MacOS 系统,间歇性偶尔续续折腾;当前,主要以 Windows 上折腾为主,天天重度使用。主要记录这几年中,开发过程中的问题,和一些办公软件、开发工具相关的问题;疑难杂症和经验之谈,涉及面:
- WINDOWS & MSVC & MinGW
- LINUX & GCC
- MACOS & CLANG
- 办公 & 居家 & 生产力 的软件
后续:人生 & 职场 & 感悟 & 哲学 (以后有时间写)
-
使用 Qt Creator 提升控件自定义控件时,操作如下, MSVC 和 WinGW 都可编译通过,亲测出来的方案;通常报错如下
通常报错 ”ui_mainui.h:22:10: fatal error: chatinputedit.h: No such file or directory #include "chatinputedit.h" ^~~~~~~~~~~~~~~~~“
[解] 不添加 Global,且 CMake 添加 include_directories 说明此提升的头文件路径
1. `promoted to` 提升自定控件操作如图,然后在 CMakeLists.txt 中添加包含此头文件的路径,添加 `include_directories(${PROJECT_SOURCE_DIR}/widgets)`,用于修复 Qt Design 使用提升自定义控件后, MinGW 找不到而编译失败。 - 若是要降低会原本的 Q控件,使用 `Demote to` - 若仅仅只用 MSVC 编译,上图片中的 `Promoted class name:` 添加自定义类名后,在 `Header file:` 后面自动生成文件后,补上其相对路径的部分,然后 不用写 include_directories 这一行,也可以直接编译通过
-
Mac 13 上用 Clang64 编译 Qt+CMake 报错:
:-1: error: ninja: build stopped: subcommand failed.
[解] 1.可能得 kit 没有设置好 2. CMake 没有安装好 3. CMakeList.txt 里面的语法存在错误,屏蔽排查(通常是)
- xx
-
如何设置安装 Visual Studio Install 使用英文语言运行?
[解] 程序运行后添加
--locale en-US
即可 -
QString
转char *
莫名其妙会失败?!!![解] 转换分为两步来完成一定没有问题,但是一步直接到, MSVC 下会偶尔有问题
在 https://github.com/feiyangqingyun/qtkaifajingyan 的 185 条已总结,同遇到和排查出来,真滴是血的教训,操操操
QString text = "xxxxx"; //下面这样转换很可能会有问题 char *data = text.toUtf8().data(); //分两步转换肯定不会有问题 QByteArray buffer = text.toUtf8(); char *data = buffer.data(); const char *data = buffer.constData();
-
微软 SDK 导致的项目编译失败哦~ [解]
-
Win10的20H2使用VS2019,拖曳窗口会崩溃!!! [解]
-
VS2019调试Qt5时QString显示为内存地址而非字符串!!! [解]
-
一个微软自带的 Notepad 所导致的问题,回车符(CR)和换行符(LF)。 [解]
-
Visual Studio 断点调试之箭头偏移进错函数,捉虫记 [解]
-
Qt Creator(Qt 15.2) 使用 MinGW 则会编译成功,改用 MSVC 2022 却编译失败!!!
-
Qt Creator(Qt 15.2) 使用 MinGW 终端的中文不会乱码,改用 MSVC 2022 却中文乱码
[解] 某些中文注释会导致编译失败 (操!!!),CMake 中设置 utf-8
MSVC 的 .h.cpp 都采用 UTF8-BOM 格式。同时可参考 8 条
# 采用 MSVC 终端上的中文不乱码 if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8") add_compile_options(/source-charset:utf-8 /execution-charset:utf-8) // 根据实际可注释 endif()
-
Qt 5.15 获取音频的输入输出,使用 MinGW 则会编译仅仅会获取一份,改用 MSVC 2022 却编译却会获得信息重复
[解] 详细参数确实有不同,如何去重的方法还在寻找中。 已解决,手动写了一个算法进行去重。
MSVC 和 MinGW 的又一个不相同,哔了狗
【问题源码和打印显示】 // 获取音频输入设备列表 QList inputDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); qDebug() << "音频输入设备列表:"; for (const QAudioDeviceInfo& deviceInfo : inputDevices) { qDebug() << "设备名称:" << deviceInfo.deviceName(); qDebug() << "支持的采样率:" << deviceInfo.supportedSampleRates(); qDebug() << "支持的声道数:" << deviceInfo.supportedChannelCounts(); qDebug() << "支持的采样大小:" << deviceInfo.supportedSampleSizes(); qDebug() << "支持的编码格式:" << deviceInfo.supportedCodecs(); qDebug() << "-------------------------------------"; } // 获取音频输出设备列表 QList outputDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); qDebug() << "音频输出设备列表:"; for (const QAudioDeviceInfo& deviceInfo : outputDevices) { qDebug() << "设备名称:" << deviceInfo.deviceName(); qDebug() << "支持的采样率:" << deviceInfo.supportedSampleRates(); qDebug() << "支持的声道数:" << deviceInfo.supportedChannelCounts(); qDebug() << "支持的采样大小:" << deviceInfo.supportedSampleSizes(); qDebug() << "支持的编码格式:" << deviceInfo.supportedCodecs(); qDebug() << "-------------------------------------"; } 🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣 ***********************************MSVC 编译器输出*********************************** [debug] m_microphoneDevices设备名称: "麦克风阵列 (适用于数字麦克风的英特尔? 智音技术)" [debug] 支持的采样率: (8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 192000) [debug] 支持的声道数: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) [debug] 支持的采样大小: (8, 16, 24, 32, 48, 64) [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- [debug] m_microphoneDevices设备名称: "麦克风阵列 (适用于数字麦克风的英特尔? 智音技术)" [debug] 支持的采样率: () [debug] 支持的声道数: (1, 2) [debug] 支持的采样大小: () [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- [debug] m_speakerDevices 设备名称: "扬声器 (Realtek(R) Audio)" [debug] 支持的采样率: (8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 192000) [debug] 支持的声道数: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) [debug] 支持的采样大小: (8, 16, 24, 32, 48, 64) [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- [debug] m_speakerDevices 设备名称: "P27q-30 (NVIDIA High Definition Audio)" [debug] 支持的采样率: (8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 192000) [debug] 支持的声道数: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) [debug] 支持的采样大小: (8, 16, 24, 32, 48, 64) [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- [debug] m_speakerDevices 设备名称: "P27q-30 (NVIDIA High Definition Audio)" [debug] 支持的采样率: (48000) [debug] 支持的声道数: (2) [debug] 支持的采样大小: (8, 16, 24, 32, 64) [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- [debug] m_speakerDevices 设备名称: "扬声器 (Realtek(R) Audio)" [debug] 支持的采样率: (48000) [debug] 支持的声道数: (2) [debug] 支持的采样大小: (8, 16, 24, 32, 64) [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- 🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣 ***********************************MinGW 编译器输出*********************************** [debug] m_microphoneDevices设备名称: "麦克风阵列 (适用于数字麦克风的英特尔? 智音技术)" [debug] 支持的采样率: (8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 192000) [debug] 支持的声道数: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) [debug] 支持的采样大小: (8, 16, 24, 32, 48, 64) [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- [debug] m_speakerDevices 设备名称: "扬声器 (Realtek(R) Audio)" [debug] 支持的采样率: (8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 192000) [debug] 支持的声道数: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) [debug] 支持的采样大小: (8, 16, 24, 32, 48, 64) [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- [debug] m_speakerDevices 设备名称: "P27q-30 (NVIDIA High Definition Audio)" [debug] 支持的采样率: (8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 192000) [debug] 支持的声道数: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) [debug] 支持的采样大小: (8, 16, 24, 32, 48, 64) [debug] 支持的编码格式: ("audio/pcm") [debug] ------------------------------------- 🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣🤣 【解决方案】还在找中,或者看如何去重
-
xxx
-
Teams 始终无法登录,提示如图:我们无法连接到你。 HTTP 404 login.micsoftonline.com
-
Office 365 企业版,无法登录账号
[解] 关掉系统代理(代理直连也不行,必须要关掉),ref1 评论
-
重装系统后,自动更新后,托盘的喇叭🔈图标错误,且无法打开
[解] 运行命令如下,亲测可用
参考 https://blog.csdn.net/Bigotry_1/article/details/121957884
1.首先按下“win+R”打开运行的窗口,点击输入命令“cmd”,并以管理员身份进入 2.然后在弹出来的窗口中点击输入“DISM.exe /Online /Cleanup-image /Scanhealth”,回车确定扫描映像是否完整 3.然后完成后再检测映像,输入:DISM.exe /Online /Cleanup-image /Checkhealth。 4.然后再修复映像,输入:DISM.exe /Online /Cleanup-image /Restorehealth。 5.最后检查系统并修复:sfc /scannow。 6.重启电脑,然后就完成了
简 述: 当初记录一些使用和开发 Deepin/UOS V20
过程中的一些奇怪的 Bug
、或者记录一些奇怪知识。
-
Debug
编译运行成功、Releas
编译成功、运行崩溃[解] 变量的值未初始化,在 Debug 模式会自动赋值,但是 Release 模式下会,不会自动赋初值;
在写 `dde-dock` 的时候,遇到编译的网速插件在 Debug 模式下会编译成功、运行成功;在 Release 下也可以编译成功,但运行会崩溃。环境如下: 💻: uos20 amd64 📎 Qt 5.11.3 📎 gcc/g++ 9.0 📎 gdb8.0 **本次错误的三个原因:** - 重写了虚函数,但是里面没有写具体的内容 - 函数有 bool 返回值,但是函数体内部没有写 - 很多虚函数只搭建了框架,里面都是空着的,运行一会后突然崩溃
-
UOS V20 控制中心编译成功、运行崩溃
[解] 然后将 `main.cpp` 的下面此处此行修改为`new` 的形式后,成功运行了
控制中心 `dde-control-center` 从 `gerrit` 上面新下载的源码, 切换到 `maintain/5.2` 分支,编译成功,运行失败,一定崩溃,界面不会显示出来;后来切换到 `uos` 分支也是一样的结果。 报错如下: #### 分析 - 重新在 gerrit 上拉取一份新的最新代码,旧的可能被未知污染了;同时再找一份电脑编译运行此项目,作为对比验证 - 控制中心运行显示, 后面要加参数 `-s` - 怀疑可能 dtk 版本过低,`dtkcore、dtkgui、dtkwidget` 都升级到最新的版本,对应的 `-dev` 包也升级了一下; - 然后重启系统; - 重建构建生成依赖 `sudo apt build-dep dde-control-center` 或者 `dpkg-checkbuilddeps` ; - 删除 `.user` 临时文件;然后重来一轮 **重新 清理、构建、运行** 再次尝试; #### 解决一 然后将 `main.cpp` 的下面此处此行修改为`new` 的形式后,成功运行了: ```cpp int main(int argc, char *argv[]) { DApplication *app = DApplication::globalApplication(argc, argv); ...省略 int main(int argc, char *argv[]) { DApplication *app = new DApplication(argc, argv); ``` #### 解决二 依旧怀疑是 `DTK` 的问题,安装了符号调试包准备调试 `DTK` 时候;运行之后 `sudo apt install libdtkwidget5-dbgsym` 之后,发现不用修改**解决一** ,此 Bug 没有再次复现,也可以成功运行。 #### 其它 如何使用 gdb 带参数调试,fpc 有一篇 markdown 文档;systemd-coredump 是干啥用的,学习一下。
-
显示器外接而苹果 3.5mm 耳机,显示没有声音,不能听歌;以为是
dde-control-center
的 bug ,升级到最新版本;依旧无效 -
QtCreator 项目,过量的调试信息;发现控制台有很多调试信息刷屏,很烦。想屏蔽这个消息
[解] 在
/etc/X11/Xsession.d/00deepin-dde-env
中注释掉QT_LOGGING_RULES="*.debug=true"
即可,然后注销之后生效。可在 QtCreator 中,项目-Build & Run-Run-Run Environment
中,查看到该环境变量。若为 false 就是啥都不打印, 包括你自己的 qDebug()<< ;为 true 所有的 qtdebug 日志都会打印。
-
xxx
- xxx
另外发现几个甚是出彩的开发 Qt, CMake, Windows 相关的经验总结,可以多观摩和体会,很多问题,经过自己不懈的熬夜调试,发现都是前人已经遇到且总结出来的,去搜搜关键词,通常会有意外之喜;
人生苦短,疼爱自己,多陪家人。
- 飞扬青云,自己总结的这十多年来做Qt开发以来的经验
- 偕臧, QtExamples,控件使用和原理,DTK 重绘控件框架解析;常见IDE技巧
- wangwenx190,学习编程过程中所记的笔记,CMAKE,Qt,MSVC 等
若有质量较佳的集合,欢迎提 PR 补充