最近在网上瞎逛时,发现了一个调试Qt应用程序的好东西:GammaRay。 按照官方介绍: GammaRay is a software introspection tool for Qt applications developed by KDAB. Leveraging the QObject introspection mechanism it allows you to observe and manipulate your application at runtime. This works both locally on your workstation and remotely on an embedded target. 使用GammaRay可以在运行时直接查看Qt应用内的对象树,修改对象属性,查看信号槽连接和发射情况,查看界面布局等等。 对于我来说,GammaRay最大的作用有两个:
executable_file_list = [] for parent, _, files in walk(join(APP_PATH, 'Contents/MacOS')): for file in files: executable_file_list.append(join(parent, file))
for parent, _, files in walk(join(APP_PATH, 'Contents/PlugIns/gammaray')): for file in files: if file.endswith('.so') or file.endswith('.dylib'): executable_file_list.append(join(parent, file))
check_call([ join(QT_DIR, 'bin/macdeployqt'), APP_PATH, '-verbose=3', '-dmg', # 生成dmg文件 *['-executable=' + executable_file for executable_file in executable_file_list] ], cwd='/Applications', # 最终生成的dmg文件所在目录 )
迫于生计,紧急支援了一个客户端项目。这个项目使用CMake进行工程管理,在Windows下,为了支持XP及一些特殊原因,需要先生成Visual Studio 2013工程,再进行编译。 按照README上说的,在开发机上安装完Visual Studio 2013和CMake,再运行自动化脚本,相关工程就会自动创建并编译,我就可以点个咖啡,享受C++程序员的福利时间。 然而现实是残酷的,咖啡还没下单,自动化脚本就报错了。 执行
1
cmake SOURCE_PATH -G "Visual Studio 12 2013"
时报错: The CXX compiler identification is unknown 看着像是没找到Visual Studio 2013的工具链。
印象中之前也解决过类似的问题,删除CMakeCache.txt、升级CMake、重装Visual Studio、手动设置CMAKE_CXX_COMPILER。结果一轮操作下来,还是相同的报错: The CXX compiler identification is unknown 一个上午过去了,连开发环境都没部署完,这就很尴尬了。难道要放重装系统的大招?
Build started 11/30/2021 11:10:35 PM. Project "SecretPath\CMakeFiles\3.21.1\CompilerIdC\CompilerIdC.vcxproj" on node 1 (default targets). PrepareForBuild: Creating directory "Debug\". Creating directory "Debug\CompilerIdC.tlog\". InitializeBuildStatus: Creating "Debug\CompilerIdC.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified. ClCompile: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\CL.exe /c /nologo /W0 /WX- /Od /Oy- /D _USING_V110_SDK71_ /D _MBCS /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Debug\\" /Fd"Debug\vc120.pdb" /Gd /TC /analyze- /errorReport:queue CMakeCCompilerId.c CMakeCCompilerId.c CMakeCCompilerId.c : fatal error C1001: An internal error has occurred in the compiler. [SecretPath\CMakeFiles\3.21.1\CompilerIdC\CompilerIdC.vcxproj] (compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\p0io.c', line 2807) To work around this problem, try simplifying or changing the program near the locations listed above. Please choose the Technical Support command on the Visual C++ Help menu, or open the Technical Support help file for more information Done Building Project "SecretPath\CMakeFiles\3.21.1\CompilerIdC\CompilerIdC.vcxproj" (default targets) -- FAILED.
是因为无法编译这些测试文件,才导致CMake无法识别么? 拿着fatal error C1001和f:\dd\vctools\compiler\cxxfe\sl\p1\c\p0io.c作为关键字搜了一波,还真搜到了相关的信息。 fatal error C1001: An internal error has occurred in the compiler. ‘f:\dd\vctools\compiler\cxxfe\sl\p1\c\p0io.c 在这个问题下,有人提到操作系统的locale设置会影响编译器编译p0io.c这个文件。关闭Windows 10区域设置中的Beta版: 使用Unicode UTF-8提供全球语言支持 / Beta: Use Unicode UTF-8 for worldwide language support就可以解决这个问题。(更详细的讨论) 碰巧我的开发机之前为了验证该设置对程序的影响,手动打开过。之后就再也没管过。关闭设置之后,再重新执行CMake,终于成功识别出了Visual Studio 2013的工具链。 总结一下,遇到问题先看日志,别急着套用之前的解决方案。CMake这种成熟的开源软件,给出的错误日志都很详细,直接对着日志排查/上网搜索关键字,往往比无脑重装软件更快。
-- Could NOT find Qt6CoreTools (missing: Qt6CoreTools_DIR) CMake Warning at /Users/***/Qt/6.2.1/macos/lib/cmake/Qt6/Qt6Config.cmake:176 (find_package): Found package configuration file:
but it set Qt6Core_FOUND to FALSE so package "Qt6Core" is considered to be NOT FOUND. Call Stack (most recent call first): src/CMakeLists.txt:1 (find_package)
-- Could NOT find Qt6GuiTools (missing: Qt6GuiTools_DIR) CMake Warning at /Users/***/Qt/6.2.1/macos/lib/cmake/Qt6/Qt6Config.cmake:176 (find_package): Found package configuration file:
but it set Qt6Gui_FOUND to FALSE so package "Qt6Gui" is considered to be NOT FOUND. Call Stack (most recent call first): src/CMakeLists.txt:1 (find_package)
看着也没什么问题。但实际输出的列表中,层级比较深的几个目录节点,和下面的子节点,顺序始终是错的。直接连接mysql,查找db中所有path_ids以p+/开头的节点,并以path_ids升序排序返回id和path_ids,得到的结果也是错误的。难道是MySQL的错? 一顿Google之后,发现问题关键点了。按照The BLOB and TEXT Types中提到的。BLOB/TEXT类型的字段只有前max_sort_length个字节被用于排序。max_sort_length默认值为1024。在我们这个场景中,因为路径比较深,节点和下面的子节点的path_ids字段长度超过了1024。MySQL在排序时,无法正确处理这些节点的先后顺序。 找到问题原因后,解决方案就比较多了。
../qt-everywhere-src-5.14.2/configure -opensource \ -confirm-license \ -verbose \ -release \ -nomake tests \ -nomake examples \ -webengine-proprietary-codecs make make install
这样执行,编译结果和中间文件都在build目录中生成。如果需要修改配置重新编译,直接清空build目录再重新配置生成就可以了。 因为编译过之前之前的版本,都是一次通过,以为这次也会一样顺利。周五下班前开始编译,周一上班时直接就可以用了。结果周末远程回公司电脑看编译结果,看到了一堆错误。根源是src/qtwebengine/src/3rdparty/chromium/build/mac/find_sdk.py抛了Exception: No 10.15.4+ SDK found的异常。 一顿搜索后,在Qt BugReports系统里找到了别人提的bug(QTBUG-83318)。报告人和我一样,在编译Qt 5.14.2版本的时候遇到了这个问题。开发给出的解释是10.15.4开始,xcrun命令输出的SDK版本信息格式为Major.Minor.Patch,而不是原来的Major.Minor,而原有的编译脚本没有适配这个改动。5.12.9以及5.15的正式版上会修复这个问题。而5.14版本不是LTS版本,5.14.2之后不会再有新的小版本更新,需要我们自行修复。 研究了一下5.15上修复bug的commit,基本就是修改一下src/buildtools/config/mac_osx.pri里获取mac_sdk_min的方式,适配一下新的格式。在5.14.2源代码的对应位置中修改一下,就可以修复这个报错,让编译继续。 之后又遇到了一个异常:src/qtwebengine/src/3rdparty/chromium/build/toolchain/mac/filter_libtool.py在执行IsBlacklistedLine时抛了TypeError: cannot use a string pattern on a bytes-like object异常。这个是因为我系统中的python默认为python3。filter_libtool.py中执行libtoolout.communicate()得到的_和err类型为bytes,但IsBlacklistedLine期待的入参类型为str。这个需要在得到err后,执行
昨天修改了一些客户端代码,在发布app前例行跑一遍脚本,对app做公证。结果执行xcrun altool --notarize-app时,报了内容为You must first sign the relevant contracts online. (1048)的错误。 Google了一番之后,大概明白了这个错误是咋出来的了。 苹果更新了一些协议条款,需要开发者接受条款后才能继续使用服务。但公证脚本中对应的开发者账户,还没来得及接受条款。导致执行xcrun altool相关命令时,服务器返回了You must first sign the relevant contracts online. (1048)错误。 了解了原因,解决起来也快。让开发者账户的拥有者登录一下 https://appstoreconnect.apple.com/agreements/# ,把所有条款都确认一遍。再执行公证流程就可以了。