登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 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


总数:13 页次:1/2 首页 下一页  >>  尾页  
总数:13 页次:1/2 首页 下一页  >>  尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1