您的位置:
首页
>>
CLQ工作室开源代码
>> 主题: qt 5.12.10 在 gcc11 下编译的一个补丁处理的方法 [‘::min’ has not been declared; did you mean ‘std::min’]
[回主站]
[分站链接]
您的位置:
首页
>>
CLQ工作室开源代码
>> 主题: qt 5.12.10 在 gcc11 下编译的一个补丁处理的方法 [‘::min’ has not been declared; did you mean ‘std::min’]
[最新]
[回主站]
标题
qt 5.12.10 在 gcc11 下编译的一个补丁处理的方法 [‘::min’ has not been declared; did you mean ‘std::min’]
clq
浏览(974) +
2022-05-20 18:08:26 发表
编辑
关键字:
[2022-05-28 13:22:10 最后更新]
qt 5.12.10 在 gcc11 下编译的一个补丁处理的方法 错误信息为 qendian.h:333:54: error: ‘::min’ has not been declared; did you mean ‘std::min’? 大概看了一下 bing 上的各种修改方法,其实本质上都是因为 gcc11 将 <limits> 中的 min max 功能独立了出来。所以产生了这个错误,所以在影响到的文件中加入就可以了。 不过也有国外网友说要加 <stdexcept> 一起,所以就有了以下一般的 patch 文件的内容 +#include <stdexcept> +#include <limits> 参考 https://github.com/msys2/MINGW-packages/issues/10502 一般所说的要修改的文件大致为以下的文件,如果和您的 qt 版本对不上的话,自己看下错误提示和 qt 源码中搜索一下文件名就 ok 了的,不要担心: qbytearraymatcher.h qbytearray.h qendian.h qfloat16.h ps. 更新 近日看到一个新颖的兼容更好的处理方式。即用 (std::max)() 来代替这些函数调用。这样可以很好的避免纯 c 和 C++ 环境下的这两套函数的冲突问题。 本质上这是 max min 宏和 std::max std::min 在宏的替换作用下导致 std::min 下的用不了。 还有些地方可以使用 #undef min 这样的方式,不过适用面没有括号的大。
clq
2022-05-20 18:14:03 发表
编辑
参考 https://salsa.debian.org/qt-kde-team/qt/qtbase/-/blob/master/debian/patches/gcc_11_limits.diff https://github.com/msys2/MINGW-packages/files/7832089/0320-gcc-11-std-fix.zip 后面这个下载来的是一个 patch 文件,据说可以在 linux 打补丁。不过打开一个其实按文本处理也一样的,很简单。 编译命令参考 https://blog.csdn.net/qq_41884002/article/details/116942605 可以用以下 ./configure -prefix $PWD/qtbase -opensource -nomake tests 或者 ./configure -prefix $PWD/qtbase -opensource -nomake tests -c++std c++11
clq
2022-05-20 23:35:55 发表
编辑
https://download.qt.io/official_releases/qt/5.12/5.12.12/single/
clq
2022-05-21 23:25:03 发表
编辑
修改这个后,一般来说仍然会有别的错误。解决办法因为不同的情况会有很多,不过这里有一个巨坑。不过不是 qt 的而是 configure 相关命令的系统特性造成的。 看了很多人说改这个改那个都不行,包括很多老外在好几个有名的站点上的回答其实都没有答到点上,都是治标不治本。 其实说出来也是“不值一文(闻)”,那就是 configure 命令系统是有缓存的,不清缓存咋改都没用!!! 所以很多人修改了很多都没弄好,其实他们的每个方法都基本上是正确的了,只是因为没有清缓存而已。 好了,下面的话得让大家破口大骂扔砖头了 -- 那就是我也不清楚怎么绝对正确的清缓存 :) 哈哈。 因为我对这种命令行的系统实在兴趣不大,开源的所谓大侠们思想反人类的又多,我是看不惯的,没兴趣研究他们到底写了些什么 ... 真的,这一点都不是因为我狂, 想必接触开源 world 10 年以上的大部分都会同意我的说法。 好了扯远了,我知道的清缓存的方法就是删除 configure 命令执行后产生的 config.cache 和 .qmake.cache 。后者可能不一定需要删除。 以下是我碰到的其他问题及解决办法。我是 arm64 ,也就是所谓的 aarch64 ---------------------------------------------------------------- 1. 首先一个大问题就是 opengl 。 其实这是一个大选项,有说要先编译一个什么 opengl 开源库什么的,也没错。不过实际上一般情况下系统里是有的。 那么 arm64 下一般的 opengl 从各个文章看一般是选择 es2 。不过官方说明不是。不过我还是选择了 es2 ,因为官方说明在 arm windows 等于系统下推荐的选择是不同的, 还不如直接全按 es2算了。 所以这个配置命令应该是 ./configure -prefix $PWD/qtbase -opensource -nomake tests -opengl es2 感兴趣的话可以试试以下命令: ./configure -prefix $PWD/qtbase -opensource -nomake tests ./configure -prefix $PWD/qtbase -opensource -nomake tests -c++std c++11 ./configure -prefix $PWD/qtbase -opensource -nomake tests -opengl desktop 可看 ./configure -help 的说明,也可以看以下: https://www.shuzhiduo.com/A/1O5ENZGd7a/ -no-opengl ......... Do not support OpenGL. -opengl ...... Enable OpenGL support with specified API version.Available values for : desktop - Enable support for Desktop OpenGL dynamic - Enable support for dynamically loadedOpenGL (either desktop or ES) * es2 - Enable support for OpenGL ES 2.0 * -no-openvg ......... Disables OpenVG functionality. 1.2 以下是 opengl es2 的个人安装方法 sudo apt-get install mesa-common-dev 后 gl.h 是有了的 linux 安装opengles2 sudo apt-get install libgles2-mesa sudo apt-get install libgles2-mesa-dev 按提示改 config 相关的 qmake 文件是没有用的,要直接复制两个文件 sudo cp '/usr/lib/aarch64-linux-gnu/libGLdispatch.so' /usr/lib/ sudo cp libGLESv2.so /usr/lib/ 然后再提示 error: unrecognized command line option '-mrdrnd' https://github.com/meta-qt5/meta-qt5/issues/342 中说这个检测是可以忽略的 2. 这个 '-mrdrnd' 参数可以修改两个文件解决。 gcc-base.conf icc-base-unix.conf 要清除缓存才能生效。怎么知道这两个文件的?用 vscode 搜索就行了。 3. 一个网友的说法: Qt 默认在 /usr/lib/ 目录下查找动态链接库,但是很多 Linux 发行版将 OpenGL 链接库放在其它目录, 例如我使用的是 CentOS 7,OpenGL 链接库位于 /usr/lib64/ 目录,而对于 Ubuntu, OpenGL 链接库位于 /usr/lib/i386-linux-gnu/mesa/ 目录。 只要我们把 libGL.so 拷贝到 /usr/lib/ 目录,或者在 /usr/lib/ 目录下为 libGL.so 创建一个链接, 就能解决问题。显然第二种办法更好
clq
2022-05-21 23:42:58 发表
编辑
4. config 成功后 make make install 即可。 不过一般还是会有问题,如: /usr/include/c++/11/cstdlib:75:15: fatal error: stdlib.h: 没有那个文件或目录 75 | #include_next <stdlib.h>
一般的说法是要用 c++ 11 中的头文件,所以要屏蔽 /usr/include 目录。
去掉所有的 -isystem /usr/include 确实是就可以了。
clq
2022-05-22 00:02:47 发表
编辑
5. 如果清除 cache 的话,似乎可以修改两个文件来配置目录(include 的和 lib 的)。当然能不改最好。 linux.config qmake.config 要注意的是后面这个文件在不同 cpu 架构下都有一个,所以要仔细看下,不要改错了。
clq
2022-05-22 01:02:36 发表
编辑
6. 暴力修改 makefile 文件。 如果生成的文件有小的瑕疵,比如 4 里面的 -isystem /usr/include 影响 stdlib.h 查找的问题,可以直接修改 INCPATH 里的内容,删除就可以了。 INCPATH = -I. -I../3rdparty/zlib/src -I../../include 比如还是 opengl 会影响到的 '/home/.../qt-everywhere-src-5.12.12/qtbase/src/gui/Makefile' 至于怎么知道的,那是因为 qt 编译过程中会提示它进入了那个目录,执行了什么命令,你可以直接执行相关的 gcc g++ 命令后,按出错内容修改编译成功后再改 Makefile 就可以了。 当然本质上是改 config 是正途。不过嘛,有时候时间真的是宝贵的 ...
clq
2022-05-22 19:16:51 发表
编辑
7. 像 6 那样手工修改的地方太多。有一个未正式证实的办法,将 .config 中的 QMAKE_CFLAGS_ISYSTEM = -isystem 修改为 QMAKE_CFLAGS_ISYSTEM = -I 据说是因为 gcc 高版本中的 include_next 对系统目录太敏感造成的。 参考 https://blog.csdn.net/xuleisdjn/article/details/108345311
clq
2022-05-22 19:22:45 发表
编辑
8. 还有一个未证实的问题。在编译到插件示例时,会提示 QPluginLoader instance(); 不存在之类的。这其实没有打开动态库功能。 相关定义为 QT_FEATURE_library 所以命令修改为 ./configure -prefix $PWD/qtbase -opensource -nomake tests -opengl es2 -feature-library 但这个 -feature-library 会导致更多的错误。 所以要示不是太高的地方似乎可以先关闭这些用到插件的项目。或者是改为 //clq //调用静态插件 foreach (QObject *plugin, QPluginLoader::staticInstances()) { //AddToCombo(plugin); } return true; //-------- /* pluginsDir.cd("plugins"); foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { //QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); QPluginLoader pluginLoader; pluginLoader.setFileName(pluginsDir.absoluteFilePath(fileName)); //staticInstances instance //QObject *plugin = pluginLoader.instance(); //QObject *plugin = pluginLoader.staticInstances(); QObject *plugin = pluginLoader.instance(); if (plugin) { echoInterface = qobject_cast(plugin); if (echoInterface) return true; } } return false; */ 不过这样要修改的地方也挺多。
clq
2022-05-22 19:30:26 发表
编辑
9. config.log 文件确实很有用,要多看。
clq
2022-05-23 00:24:01 发表
编辑
10. python 不存在的问题。 其实很容易安装上 python3 。但是装好后还是报错,有网友的方法可用,但不太好,因为他们实际是上复制 python3 为了一个 python 。 其实这是可以用软链接的。 我们先看复制的命令: $ which python3 /usr/bin/python3 $ sudo cp /usr/bin/python3 /usr/bin/python 据说还可以改环境变量 $ vi .bashrc 将以下别名添加到.bashrc文件中。 alias python=python3 保存它并编写脚本。 $ source .bashrc 不过最好的还是软链接,命令如下: 1)python --version, ===>Python 2.7.17 //不是python3 版本软连接上2.7.17,可以如下更改 (whereis python来查看python路径) 2) 移除已有软连接 !!! 注意,先看下自己的环境,如果正常工作别删除。很危险!!! sudo rm -rf /usr/bin/python 3) 增加新的软连接 sudo ln -s /usr/bin/python3 /usr/bin/python //python3.6.9的安装路径是/usr/bin/ 4) python --version, ===>Python 3.6.9
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.