riscv 各种版本 gcc 工具链编译与安装

riscv 各种版本 gcc 工具链编译与安装

riscv gcc工具下载

Riscv 的 gcc 交叉编译器,以开源的方式托管在 github 上。链接如下:

https://github.com/riscv/riscv-gnu-toolchain

image

该仓库,里面包含了一些子仓库。

使用以下这个命令,将所有仓库,都 clone 下来。

git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

以下是各个仓库的 github 地址(这里给出 riscv-gnu-toolchain 工具链中的最新版本):

名称链接 (分支)
binutilshttps://sourceware.org/git/binutils-gdb.git (binutils-2_42-branch)
gdbhttps://sourceware.org/git/binutils-gdb.git (gdb-14-branch)
gcchttps://gcc.gnu.org/git/gcc.git (releases/gcc-13)
glibchttps://sourceware.org/git/glibc.git
dejagnuhttps://git.savannah.gnu.org/git/dejagnu.git (master)
newlibhttps://sourceware.org/git/newlib-cygwin.git (master)
qemuhttps://gitlab.com/qemu-project/qemu.git
muslhttps://git.musl-libc.org/git/musl (master)
spikehttps://github.com/riscv-software-src/riscv-isa-sim.git (master)
pkhttps://github.com/riscv-software-src/riscv-pk.git (master)
llvmhttps://github.com/llvm/llvm-project.git (release/17.x)

下面是官方版本的 github 地址(非 riscv-gnu-toolchain 中的最新版本):

riscv-gcc

https://github.com/riscv/riscv-gcc

riscv-glibc

https://github.com/riscv/riscv-glibc

riscv-newlib

https://github.com/riscv/riscv-newlib

riscv-dejagnu

https://github.com/riscv/riscv-dejagnu

riscv-gdb

https://github.com/riscv/riscv-binutils-gdb.git

riscv-binutils

https://github.com/riscv/riscv-binutils-gdb.git

riscv-qemu

https://github.com/riscv/riscv-qemu.git

这里推荐使用 riscv-gnu-toolchain 工具链中的最新版

编译riscv gcc

下载完毕后,就要开始编译。首先在 riscv-gnu-toolchain 根目录下,创建 build 目录。用于编译 riscv gcc。

riscv gcc 可以编译成以下几个版本

  • riscv32-unknown-elf-gcc

  • riscv64-unknown-elf-gcc

  • riscv32-unknown-linux-gnu-gcc

  • riscv64-unknown-linux-gnu-gcc

  • riscv64-multilib-elf-gcc

  • riscv64-liunx-multilib-gcc

以下编译,是基于 riscv架构支持 imc三种指令集,来进行编译的。如果想要支持其他的指令集,只需要修改 --with-arch选项。

1、riscv32-unknown-elf-gcc

该工具,针对于 riscv32 架构的编译器,使用的 C 运行库为 newlib。

执行以下命令:

../configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=xxx 
make

–mabi可以选择如下:

  • ilp32

  • ilp32f

  • ilp32d

编译完成后,在 /opt/riscv/bin 目录下,有 riscv32-unknown-elf-gcc 的所有工具。

image

通过 riscv32-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv32-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv32-unknown-elf/8.2.0/lto-wrapper
Target: riscv32-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-elf --prefix=/opt/riscv --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv/riscv32-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv32-unknown-elf: 指定工具为riscv32-unknow-elf
--prefix=/opt/riscv32:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-newlib:  c运行库使用newlib
--with-abi=ilp32: 工具链支持的abi方式是ilp64
--with-arch=rv32imc:  工具链支持的riscv架构是 rv64imc

在build目录下,有如下的文件夹和文件生成。

image

其中有 newlib 和 newlib-nano,就表示 C 运行库,就是用的 newlib 以及 newlib-nano。

2、riscv64-unknown-elf-gcc

该工具,针对于 riscv64 架构的编译器,使用的 C 运行库为 newlib。

执行以下命令:

../configure --prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=xxx
make

–with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在 /opt/riscv64/bin 目录下,有 riscv64-unknown-elf-gcc 的所有工具。

image

使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-elf --prefix=/opt/riscv64 --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv64/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64 --with-arch=rv64imc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-unknown-elf: 指定工具为riscv64-unknow-elf
--prefix=/opt/riscv64:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-newlib:  c运行库使用newlib
--with-abi=lp64: 工具链支持的abi方式是lp64
--with-arch=rv64imc:  工具链支持的riscv架构是 rv64imc

在 build 目录下,有如下的文件夹和文件生成。

image

其中有 newlib 和 newlib-nano,就表示 C 运行库,就是用的 newlib 以及 newlib-nano。

3、riscv32-unknown-linux-gnu-gcc

该工具,针对于 riscv32 架构的编译器,使用的 C 运行库为 linux 中的标准 glibc。

执行以下命令:

../configure --prefix=/opt/riscv32-linux --with-arch=rv32imc --with-abi=xxx --enable-linux
make linux

–with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在 /opt/riscv32-linux/bin 目录下,有 riscv32-unknown-linux-gnu-gcc 的所有工具。

image

使用 riscv32-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv32-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv-linux/libexec/gcc/riscv32-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv32-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-linux-gnu --prefix=/opt/riscv-linux --with-sysroot=/opt/riscv-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv32-unknown-linux-gnu: 指定工具为riscv32-unknow-linux-gnu
--prefix=/opt/riscv-linux:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-abi=ilp32: 工具链支持的abi方式是ilp32
--with-arch=rv32imc:  工具链支持的riscv架构是 rv32imc

虽然有 --with-newlib 配置选项,但是编译却不会有 newlib 编译,而有 glibc 编译。因为使用的是 make linux 进行编译。也可以在 configure 阶段,加上 --enable-linux 选项。

在 build 目录下,有如下文件以及文件夹:

image

可以看出,用的c运行库是glibc。

4、riscv64-unknown-linux-gnu-gcc

该工具,针对于 riscv64 架构的编译器,使用的C运行库为linux中的标准glibc。

执行以下命令:

../configure --prefix=/opt/riscv64-linux --with-arch=rv64imafdc --with-abi=xxx --enable-linux
make linux

–with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在 /opt/riscv64-linux/bin 目录下,有 riscv64-unknown-linux-gnu-gcc 的所有工具。

image

使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv64-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64-linux/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv64-linux --with-sysroot=/opt/riscv64-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-unknown-linux-gnu: 指定工具为riscv64-unknow-linux-gnu
--prefix=/opt/riscv64:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc

虽然有 --with-newlib 配置选项,但是编译却不会有 newlib 编译,而是有 glibc 编译。因为使用的是 make linux 进行编译。也可以在 configure 阶段,加上 --enable-linux 选项。

在build目录下,有如下文件以及文件夹:

image

可以看出,用的c运行库是glibc。

5、riscv64-linux-multilib

在编译 riscv 工具链的时候,可以编译 multilib 版本的 gcc,这样这个工具,可以同时支持 32 位和 64 位。

执行以下命令:

../configure --prefix=/opt/riscv-linux-multilib --enable-multilib --target=riscv64-linux-multilib
make linux

image

编译完成后,在 /opt/riscv64-linux/bin 目录下,有 riscv64-linux-multilib -gcc 的所有工具。

虽然有通过–target指定,但是生成的工具链名字还是 riscv64-unknow-linu-gnu-gcc。

使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv64-unknown-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/opt/riscv-multilib/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target= riscv64-linux-multilib --prefix=/opt/riscv-linux-multilib --with-sysroot=/opt/riscv-linux-multilib/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'
Thread model: single

可以看出:

--target= riscv64-linux-multilib: 指定工具为riscv64-linux-multilib
--prefix=/opt/riscv-linux-multilib:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc
--enabl-multilib: 启动 multilib

对于 riscv64-linux-multilib-gcc 编译器,可以通过以下选项,来决定生成的程序是 32 位版本还是 64 位版本:

  • -march=rv32: 32 位版本
  • -march=rv64: 64 位版本

6、riscv64-multilib-elf-gcc

在裸机编译 riscv 工具链的时候,可以编译 multilib 版本的 gcc,这样这个工具,可以同时支持32位和64位。

执行以下命令:

../configure --prefix=/opt/riscv64-multilib-elf --enable-multilib --target=riscv64-multilib-elf
make

编译完成后,在 /opt/ riscv64-multilib-elf /bin 目录下,有 riscv64-multilib-elf-gcc 的所有工具。

image

虽然有使用–target指定,但是生成的编译器还是 riscv64-unknown-elf-gcc。

使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.
COLLECT_GCC=./riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/opt/riscv64-multilib-elf/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-multilib-elf --prefix=/opt/riscv64-multilib-elf --disable-shared --disable-threads --disable-tls --enable-languages=c,c++ --with-system-zlib --with-newlib --with-sysroot=/opt/riscv64-multilib-elf/riscv64-unknown-elf --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'
Thread model: single
gcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-multilib-elf: 指定工具为riscv64-multilib-elf
--prefix=/opt/riscv64-multilib-elf:  指定工具生成的目录
--enable-languages=c,c++:  支持c,c++语言
--with-abi=lp64d: 工具链支持的abi方式是lp64d
--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc
--enable-multilib:  启用multilib

对于 riscv64-multilib-elf-gcc 编译器,可以通过以下选项,来决定生成的程序是 32 位版本还是 64 位版本:

  • -march=rv32: 32 位版本
  • -march=rv64: 64 位版本

riscv-none-embed-gcc

专门为嵌入式使用的gcc交叉编译工具链。官方网站:

https://gnu-mcu-eclipse.github.io/toolchain/riscv/

可以直接下载 linux 的二进制执行程序,以及 windows 的安装包。这个一般要搭配 GNU MCU eclipse 工具一起使用。

因为这个工具,直接提供执行程序,因此就不介绍了。

总结

riscv的gcc编译器,分为2大类:

  • 裸机: unknown-elf,none-embed

  • linux: linux

除了 none-embed 编译器,对于每一类,如果禁用 multilib,那么又分为 32 位版本和 64 位版本。如果使能 multilib,那么就只有一个版本,但是这个版本工具,可以同时支持 32 位和 64 位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/461961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)

居民健康监测小程序目录 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

【OJ】string类题目

个人主页 : zxctscl 如有转载请先通知 题目 1. 415字符串相加1.1 分析1.2 代码 2. 344反转字符串2.1 分析2.2 代码 3. HJ1字符串最后一个单词的长度3.1 分析3.2 代码 4. 387.字符串中的第一个唯一字符4.1 分析4.2 代码 5. 125验证回文串5.1 分析5.2 代码 1. 415字符…

20240309web前端_第一周作业_完成电子汇款单

作业二&#xff1a;完成电子汇款单 成果展示: 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

【MatLab】之:Simulink安装

一、内容简介 本文介绍如何在 MatLab 中安装 Simulink 仿真工具包。 二、所需原材料 MatLab R2020b&#xff08;教学使用&#xff09; 三、安装步骤 1. 点击菜单中的“附加功能”&#xff0c;进入附加功能管理器&#xff1a; 2. 在左侧的“按类别筛选”下选择Using Simulin…

2024043期传足14场胜负前瞻

2024043期售止时间为3月17日&#xff08;周日&#xff09;21点30分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率1场&#xff0c;1.5-2.0赔率7场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等偏上。以下为基础盘前瞻&#xff0c;大家可根据…

深入浅出FISCO BCOS:区块链底层平台

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 我前面有补充相关的区块链的知识 如果没有了解的话 可能部分概念或名词会不懂哦 建议先了解一波再来看~http://t.c…

kkview远程控制: 内网远程桌面控制软件

内网远程桌面控制软件&#xff1a;高效、安全的远程管理方案 在信息技术日新月异的今天&#xff0c;内网远程桌面控制软件已成为许多企业和个人用户不可或缺的工具。这类软件允许用户通过内部网络&#xff0c;实现对其他计算机的远程访问和控制&#xff0c;从而大大提高工作效…

ARM 寄存器学习:(一)arm多种模式下得寄存器

一.ARM7种状态以及每种状态的寄存器&#xff1a; ARM 处理器共有 7 种不同的处理器模式&#xff0c;在每一种处理器模式中可见的寄存器包括 15 个通用寄存器( R0~R14)、一个或两个(User和Sys不是异常模式&#xff0c;没有spsr寄存器)状态寄存器&#xff08;cpsr和spsr&…

环形链表2(C++), test ok

1. 题目 2. 思路分析&#xff1a; 与环形链表1一样&#xff0c;我们需要定义慢指针和快指针&#xff0c;确定链表是否有环&#xff0c;如果链表没有环的话&#xff0c;直接置空即可。如果链表有环&#xff0c;则需要向环形链表1一样&#xff0c;让快指针不断追赶慢指针&#x…

Python爬虫:原理与实战

引言 在当今的信息时代&#xff0c;互联网上的数据如同浩瀚的海洋&#xff0c;充满了无尽的宝藏。Python爬虫作为一种高效的数据抓取工具&#xff0c;能够帮助我们轻松地获取这些数据&#xff0c;并进行后续的分析和处理。本文将深入探讨Python爬虫的原理&#xff0c;并结合实战…

6.【Linux】进程间通信(管道命名管道||简易进程池||简易客户端服务端通信)

介绍 进程间通信的方式 1.Linux原生支持的管道----匿名和命名管道 2.System V-----共享内存、消息队列、信号量 3.Posix------多线程、网路通信 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。…

最大异或对(trie树)

题目描述&#xff1a; 思路&#xff1a; 1、首先此题我们要知道异或的规则&#xff0c;这里不赘述了&#xff0c;可以百度 2、如果利用trie树去找到一个数字与其异或能得到最大值 比如二进制数&#xff1a;1010.....是一个很大的数 我们想要异或得到的值更大&#xff0c;就需…

AST解web控制流平坦化

此代码可以解决大部分 while if else 控制流平坦化原理&#xff1a; 先将 if 语句转为 switch 语句&#xff0c;再将 switch 分支合并&#xff0c;最后删除已合并的分支&#xff08;具体看代码&#xff09; 实现效果图 首先安装依赖&#xff1a; npm install babel/parser npm…

分布式文件存储与数据缓存(一)| FastDFS

目录 分布式文件系统FastDFS概述_简介FastDFS特性&#xff1a;分布式文件服务提供商 FastDFS概述_核心概念trackerstorageclientgroup FastDFS概述_上传机制内部机制如下 FastDFS概述_下载机制内部机制如下 FastDFS环境搭建_Linux下载安装gcc下载安装FastDFS下载安装FastDFS依赖…

c语言的字符串函数详解

文章目录 前言一、strlen求字符串长度的函数二、字符串拷贝函数strcpy三、链接或追加字符串函数strcat四、字符串比较函数strcmp五、长度受限制字符函数六、找字符串2在字符串1中第一次出现的位置函数strstr七、字符串切割函数strtok&#xff08;可以切割分隔符&#xff09;八、…

THM学习笔记—RootMe

nmap扫描&#xff0c;发现22端口和80端口打开 dirsearch扫描&#xff0c;注意到/panel和/uploads&#xff0c;在浏览器中打开 可以上传文件&#xff0c;尝试反弹shell 在尝试过程中发现网站不能上传.php文件&#xff0c;只需要将后缀更改为.php5之类即可 成功 查找文件&#x…

页面事件

下拉刷新事件 1. 什么是下拉刷新 下拉刷新是移动端的专有名词&#xff0c;指的是通过手指在屏幕上的下拉滑动操作&#xff0c;从而重新加载页面数据的行为。 2. 启用下拉刷新 启用下拉刷新有两种方式&#xff1a; ① 全局开启下拉刷新  在 app.json 的 window 节点中&…

Docker常用命令的使用及镜像的构建

1.docker的好处 在开发中可能会遇到一个问题&#xff0c;一个程序在自己电脑上能跑&#xff0c;但是换到服务器上就不行了。如果我们重新搭建环境&#xff0c;需要重新部署mysql,es,redis等组件很麻烦。有了docker之后&#xff0c;我们可以快速完成项目的部署。同时docker的隔…

MyBatis3源码深度解析(十二)MyBatis的核心组件(一)Configuration

文章目录 第四章 MyBatis的核心组件4.1 使用MyBatis操作数据库4.2 MyBatis核心组件4.3 Configuration组件4.3.1 属性4.3.2 设置4.3.3 类型别名4.3.3 类型处理器4.3.5 对象工厂4.3.6 插件4.3.7 配置环境4.3.8 映射器 第四章 MyBatis的核心组件 4.1 使用MyBatis操作数据库 在研…

《操作系统实践-基于Linux应用与内核编程》第10章-Linux综合应用

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容&#xff0c;所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者&#xff1a;房胜、李旭健、黄…