手把手交叉编译mysql

news2025/8/6 18:59:12

1.下载mysql(注意下载boost版本,这样会少一步编译)

下载mysql的时候一定要看好交叉编译工具链的版本。因为mysql 8.0需要的工具链版本较高,所以有可能不支持

 

 

查看链接如下:

MySQL :: MySQL 8.0 Reference Manual :: 2.8.2 Source Installation Prerequisites

下载链接如下:

MySQL :: Download MySQL Community Server (Archived Versions)

此处我选择5.7.40

 

2.下载 ncurses 和 openssl。

openssl有版本要求,不要乱下。openssl版本要求查看地址如下

https://dev.mysql.com/doc/refman/8.0/en/source-ssl-library-configuration.html

 

通过右上角版本切换查看需要的openssl版本。

ncurses没有版本要求,但是对自己的PC机可能会有影响。当交叉编译不过且百度又不好解决的时候,换一个版本未尝不是一个办法。最开始我使用的是ncurses 6.4,不通过换成了 6.2,后来又换成5.9才编译通过

我的编译流程是参考这位大师的,所以大家也可以看看他的原博客。我遇到的错误他基本都给出了答案

mysql交叉编译方式_交叉编译mysql_Lanceli_van的博客-CSDN博客

3.编译mysql(注意不是交叉编译,是正常编译)

cmake . -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/zx/mysql-5.7.40-pc/boost -DCMAKE_INSTALL_PREFIX=/home/zx/mysql-5.7.40-pc/output
make 

make install

这一步基本没啥问题

如果报openssl库的错误,直接安装即可

apt-get install openssl
apt-get install libssl-dev
 

4.交叉编译  ncurse 和 openssl

如果ncurse编译错误,且百度不好解决,那就换个版本在交叉编译(我换了仨版本,o(╥﹏╥)o)

交叉编译openssl

./config --prefix=/home/mysqlCompile/openssl-OpenSSL_1_1_1g/__install --cross-compile-prefix=aarch64-none-linux-gnu- no-asm shared

打开Makefile,删除Makefile里面的 -m64


make
make install
 

5.修改mysql的CMakeList,找到  PROJECT(${MYSQL_PROJECT_NAME})  添加如下内容。(注意修改交叉编译工具和路径)(注意格式,一定要注意对齐,否则会出现-Wmisleading-indentation错误。如果不知道前面用tab还是空格,那就直接复制下面的格式来对齐

#----------------------------------------------------------------
IF(1)
    
set(CMAKE_FIND_ROOT_PATH "/home/zx/arm-linux/bin")
set(CMAKE_CROSSCOMPILING TRUE)
SET(CMAKE_SYSTEM_NAME Linux)

# 设置交叉编译器
SET(CMAKE_C_COMPILER_WORKS 1)
SET(CMAKE_CXX_COMPILER_WORKS 1)
SET(CMAKE_C_COMPILER   "arm-linux-gnueabihf-gcc")
SET(CMAKE_CXX_COMPILER "arm-linux-gnueabihf-g++")

# 交叉编译时的编译选项,cpu 需要该选项的时候添加,没有可以不加  
#SET(ARM_CFLAG "-march=armv7-a -Og -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 -pipe -feliminate-unused-debug-types")
#SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")

# search for programs in the build host directories
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

SET(STACK_DIRECTION 1)
SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_CROSSCOMPILING 1)
set(BOOST_INCLUDE_DIR /home/zx/mysql-5.7.40/boost/boost_1_59_0)
set(LOCAL_BOOST_DIR /home/zx/mysql-5.7.40/boost/boost_1_59_0)
    
# openssl configuration
SET(OPENSSL_INCLUDE_DIR /home/zx/openssl-1.1.1g/output/include)
SET(OPENSSL_LIBRARY /home/zx/openssl-1.1.1g/output/lib/libssl.so.1.1)
SET(CRYPTO_LIBRARY /home/zx/openssl-1.1.1g/output/lib/libcrypto.so.1.1)

SET(CMAKE_CXX_LINK_FLAGS "-L/home/zx/openssl-1.1.1g/output/lib -lssl -lcrypto")
ENDIF()
#----------------------------------------------------------------

PROJECT(${MYSQL_PROJECT_NAME})

#----------------------------------------------------------------
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARM_CFLAG}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARM_CFLAG}")
#----------------------------------------------------------------
 

修改mysql的 cmake/libevent.cmake 文件,(在说一遍,注意格式对齐)

MACRO(FIND_LIBEVENT_VERSION)

  SET(LIBEVENT_VERSION "2.1.11-stable")
  SET(COMPILE_TEST_RESULT TRUE)
  SET(RUN_OUTPUT "2.1.11-stable")

  # MESSAGE(STATUS "TRY_EVENT TEST_RUN_RESULT is ${TEST_RUN_RESULT}")
  # MESSAGE(STATUS "TRY_EVENT COMPILE_TEST_RESULT is ${COMPILE_TEST_RESULT}")
  # MESSAGE(STATUS "TRY_EVENT COMPILE_OUTPUT_VARIABLE is ${OUTPUT}")
  # MESSAGE(STATUS "TRY_EVENT RUN_OUTPUT_VARIABLE is ${RUN_OUTPUT}")

  IF(COMPILE_TEST_RESULT)
    SET(LIBEVENT_VERSION_STRING "${RUN_OUTPUT}")
    STRING(REGEX REPLACE
      "([.-0-9]+).*" "\\1" LIBEVENT_VERSION "${LIBEVENT_VERSION_STRING}")
    MESSAGE(STATUS "LIBEVENT_VERSION_STRING ${LIBEVENT_VERSION_STRING}")
    MESSAGE(STATUS "LIBEVENT_VERSION (${WITH_LIBEVENT}) ${LIBEVENT_VERSION}")
  ELSE()
    MESSAGE(WARNING "Could not determine LIBEVENT_VERSION")
  ENDIF()
ENDMACRO()

6.执行cmake

cmake ../ -DCMAKE_INSTALL_PREFIX=/home/zx/mysql-5.7.40/output -DMYSQL_DATADIR=/home/zx/mysql-5.7.40/output/data -DWITH_BOOST=/home/zx/mysql-5.7.40/boost/boost_1_59_0 -DSYSCONFDIR=/etc -DEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci -DENABLED_LOCAL_INFILE=1 -DSTACK_DIRECTION=1 -DCURSES_LIBRARY=/home/zx/ncurses-5.9/output/lib/libncurses.a -DCURSES_INCLUDE_PATH=/home/zx/ncurses-5.9/output/include -DWITH_MYISAM_STORAGE_ENGINE=1

此时报了一个错

-- Performing Test X_PUTLONG_NOT_USE_CONST - Failed
-- Checking for module 'libtirpc'
--   No package 'libtirpc' found

解决办法参考此网站解决

 mysql 编译提示 undefined reference to `xdr_pointer‘_llongint的博客-CSDN博客

尝试解决1、直接安装:

yum install -y libtirpc-devel

再编译提示: 

-- Checking for module 'libtirpc'
--   Found libtirpc, version 0.2.4
CMake Warning at cmake/rpc.cmake:58 (MESSAGE):
  Ignoring libtirpc version 0.2.4, need at least 1.0
Call Stack (most recent call first):

尝试解决2:手动添加
版本太低没有捷径可走,只能手动重新编译,从这下载一个新点的版本:https://www.linuxfromscratch.org/blfs/view/svn/basicnet/libtirpc.html 

./configure --prefix=`pwd`/install
make -j`nproc` && make install


再移除系统库:

yum remove -y libtirpc-devel

再编译还是提示找不到: 

-- Performing Test X_PUTLONG_NOT_USE_CONST - Failed
-- Checking for module 'libtirpc'
--   No package 'libtirpc' found

查看库查找方式:(进入到mysql的cmake目录下) 

$ sed -n '49,53p' cmake/rpc.cmake
MACRO(MYSQL_CHECK_RPC)
  IF(LINUX AND NOT LIBTIRPC_VERSION_TOO_OLD)
    MYSQL_CHECK_PKGCONFIG()
    PKG_CHECK_MODULES(TIRPC libtirpc)
  ENDIF()

看到PKG_CHECK_MODULES 方式查找只需要再拷贝一下 .pc 文件即可

cp install/lib/pkgconfig/libtirpc.pc /usr/lib64/pkgconfig/

查找成功提示 

-- Found PkgConfig: /usr/bin/pkg-config (found version "0.27.1")
-- Checking for module 'libtirpc'
--   Found libtirpc, version 1.3.2

 后面遇到错误跟大佬基本相同,但大佬有些内容写的微微有些模糊,稍微走了下弯路,故进行一个理解更新

第一个错误

/bin/sh: 1: comp_err: not found
这个错误从字面上理解,就是这个脚本没有发现。解决办法就是把我们之前本机编译得到的 comp_err 文件移动到编译环境中的 bin 文件夹中:

cp /home/mysql-5.7.40/extra/comp_err /home/zx/arm-linux/bin/
touch /home/zx/arm-linux/bin//bin/comp_err

继续执行 make 命令进行编译,我们会遇到第二个错误。

/bin/sh: 1: ./libmysql_api_test: Exec format error
解决办法是将本机编译得到的 libmysql_api_test 文件,移动到交叉编译对应的文件夹中:

cp /home/zx/mysql-5.7.40-pc/libmysql/libmysql_api_test /home/zx/mysql-5.7.40/libmysql/
注意,是从第一步编译的路径下文件拷贝到交叉编译的mysql根目录下的libmysql

继续执行 make 命令进行编译,我们会遇到第三个错误。 

error “Unsupported platform”


In file included from /home/mysqlCompile/mysql-5.7.32/storage/innobase/include/os0atomic.h:375,
                 from /home/mysqlCompile/mysql-5.7.32/storage/innobase/include/ut0ut.h:47,
                 from /home/mysqlCompile/mysql-5.7.32/storage/innobase/include/univ.i:591,
                 from /home/mysqlCompile/mysql-5.7.32/storage/innobase/include/ha_prototypes.h:40,
                 from /home/mysqlCompile/mysql-5.7.32/storage/innobase/api/api0api.cc:35:
/home/mysqlCompile/mysql-5.7.32/storage/innobase/include/os0atomic.ic:230:2: error: #error "Unsupported platform"
  230 | #error "Unsupported platform"
 

这个问题如提示所示,是平台不支持,原因是宏定义的问题。os0atomic.ic 中有 HAVE_IB_GCC_ATOMIC_COMPARE_EXCHANGE 与 IB_STRONG_MEMORY_MODEL 这两个宏定义。

在 os0atomic.h 的 60 行附近, 从以上的内容可以看出,只有定义了

 __i386__ || __x86_64__ || _M_IX86 || _M_X64 || __WIN__ 
 

才能定义 IB_STRONG_MEMORY_MODEL,但是我们是交叉编译 mysql,平台是 arm,明显上面的内容没有定义,所以在交叉编译的时候就没有定义,导致 os0atomic.ic 中的内容没有编译。修改办法如下:

#if defined __i386__ || defined __x86_64__ || defined _M_IX86 \
    || defined _M_X64 || defined __WIN__

#define IB_STRONG_MEMORY_MODEL

#else

#define HAVE_ATOMIC_BUILTINS

#endif /* __i386__ || __x86_64__ || _M_IX86 || _M_X64 || __WIN__ */
 

HAVE_ATOMIC_BUILTINS 这个宏不是随便定义的,可在文章 MariaDB · 社区动态 · MariaDB on Power8 中了解到。

但这样并不能完全解决问题,在 os0atomic.h 文件中找到 os_compare_and_swap_thread_id() 这个函数的定义,而在这个函数的前面有编译条件如下:

# ifdef HAVE_IB_ATOMIC_PTHREAD_T_GCC
#if defined(HAVE_GCC_SYNC_BUILTINS)
#  define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
    os_compare_and_swap(ptr, old_val, new_val)
#else
UNIV_INLINE
bool
os_compare_and_swap_thread_id(volatile os_thread_id_t* ptr, os_thread_id_t old_val, os_thread_id_t new_val)
{
  return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
}
#endif /* HAVE_GCC_SYNC_BUILTINS */

 

但是交叉编译工具GCC中没有这两个宏,所以运行不了,解决方法是改为如下:

# ifdef HAVE_ATOMIC_BUILTINS
#if defined(HAVE_ATOMIC_BUILTINS)
#  define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
    os_compare_and_swap(ptr, old_val, new_val)
#else
UNIV_INLINE
bool
os_compare_and_swap_thread_id(volatile os_thread_id_t* ptr, os_thread_id_t old_val, os_thread_id_t new_val)
{
  return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
                                     __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
}
#endif /* HAVE_GCC_SYNC_BUILTINS */
 

在上面大佬的交叉编译中,有个错误

在原基础修改之上,还需修改storage/innobase/include/os0atomic.ic的第 198 行

#elif defined(IB_STRONG_MEMORY_MODEL)

#elif defined(IB_STRONG_MEMORY_MODEL) || defined (HAVE_ATOMIC_BUILTINS)

继续执行 make 命令进行编译,我们会遇到第四个错误。 

No rule to make target ‘scripts/comp_sql’ 


make[2]: *** No rule to make target 'scripts/comp_sql', needed by 'scripts/sql_commands_sys_schema.h'.  Stop.

解决办法如下: 

cp /home/zx/mysql-5.7.40-pc/scripts/comp_sql /home/zx/mysql-5.7.40/scripts/
touch  /home/zx/mysql-5.7.40/scripts/comp_sql

注意路径还是mysql的根目录下的scripts拷贝,非安装目录

继续执行 make 命令进行编译,我们会遇到第五个错误。

/bin/sh: 1: comp_sql: not found
解决办法如下:

cp /home/zx/mysql-5.7.40-pc/scripts/comp_sql /home/zx/arm-linux/bin/
touch /home/zx/arm-linux/bin/comp_sql

注意是拷贝第一步编译的mysql文件

 继续执行 make 命令进行编译,我们会遇到第六个错误。

/bin/sh: 1: gen_lex_hash: not found
解决办法如下:

cp /home/zx/mysql-5.7.40-pc/sql/gen_lex_hash /home/zx/arm-linux/bin/
touch /home/zx/arm-linux/bin/gen_lex_hash

注意是拷贝第一步编译的mysql文件

继续执行 make 命令进行编译,我们会遇到第七个错误。  

/bin/sh: 1: gen_lex_token: not found
解决办法如下:

cp /home/zx/mysql-5.7.40-pc/sql/gen_lex_token /home/zx/arm-linux/bin/
touch /home/zx/arm-linux/bin/gen_lex_token

注意是拷贝第一步编译的mysql文件

继续执行 make 命令进行编译,我们会遇到第八个错误。

cannot find -ltirpc
/home/lanceli/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.2.1/../../../../aarch64-none-linux-gnu/bin/ld: cannot find -ltirpc
collect2: error: ld returned 1 exit status
make[2]: *** [rapid/plugin/group_replication/CMakeFiles/group_replication.dir/build.make:1488: rapid/plugin/group_replication/group_replication.so] Error 1
make[1]: *** [CMakeFiles/Makefile2:5620: rapid/plugin/group_replication/CMakeFiles/group_replication.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
 

这个问题直接修改link.txt,查找并将里面的-ltirpc删除即可。如果感兴趣,可以向后查看解决思路。

这个问题我们需要查看 rapid/plugin/group_replication/CMakeFiles/group_replication.dir/build.make 文件查找(CMAKE_COMMAND) -E cmake_link_script所在的位置: 

cd /home/mysqlCompile/mysql-5.7.32/rapid/plugin/group_replication && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/group_replication.dir/link.txt --verbose=$(VERBOSE)  

这里执行了一行命令,而命令的位置在 cmake_link_script CMakeFiles/group_replication.dir/link.txt 

这里显示找不到 -ltirpc 这一个指令,我们查看 link.txt 文件,并找出 -ltirpc 将它删除即可。

继续执行 make 命令进行编译,我们会遇到第九个错误
 

/bin/sh: 1: protoc: not found
解决办法如下:

cp /home/zx/mysql-5.7.40-pc/extra/protobuf/protoc /home/zx/arm-linux/bin/
root@DESKTOP-PGPFAI6:~# touch /home/zx/arm-linux/bin/protoc

继续执行 make 命令进行编译,我们会遇到第十个错误。 

cannot find -lboost_system -lboost_chrono
这个问题跟之前的 -ltirpc 一样,都是声明后找不到对应的库,这次我们不能将这两个删除掉,因为编译的过程需要用到这两个库。

/home/lanceli/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.2.1/../../../../aarch64-none-linux-gnu/bin/ld: cannot find -lboost_system
/home/lanceli/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.2.1/../../../../aarch64-none-linux-gnu/bin/ld: cannot find -lboost_chrono
collect2: error: ld returned 1 exit status
make[2]: *** [client/dump/CMakeFiles/mysqlpump.dir/build.make:92: client/dump/mysqlpump] Error 1
make[1]: *** [CMakeFiles/Makefile2:12520: client/dump/CMakeFiles/mysqlpump.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
 

根据错误提示,我们打开 client/dump/CMakeFiles/mysqlpump.dir/build.make 文件,定位到第 92 行。 

cd /home/zx/mysql-5.7.40/client/dump && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/mysqlpump.dir/link.txt --verbose=$(VERBOSE)
 

打开相同路径下的 link.txt 文件,并将其中 -lboost_system -lboost_chrono 修改为: 

/home/zx/mysql-5.7.40/bost/boost_1_59_0/__install/lib/libboost_system.so -ldl /home/zx/mysql-5.7.40/bost/__install/lib/libboost_chrono.so -ldl

继续执行 make 命令进行编译,然后等待代码编译结束。 

输入 make install 进行安装,即可在设置的安装路径找到相应的文件。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

InstructGPT方法简读

InstructGPT方法简读 引言 仅仅通过增大模型规模和数据规模来训练更大的模型并不能使得大模型更好地理解用户意图。由于数据的噪声极大,并且现在的大多数大型语言模型均为基于深度学习的“黑箱模型”,几乎不具有可解释性和可控性,因此&…

「SAP ABAP」OPEN SQL(四)【FROM语句】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

CIMCAI port ai shipping ai artificial intelligence smart port

上海人工智能独角兽中集集团高科技中集飞瞳,是全球应用落地最广,规模最大,最先进的的港航人工智能高科技企业,工业级成熟港航人工智能产品全球规模化落地应用,全球前三大船公司及港口码头应用落地。上海人工智能独角兽…

3.4 按键控制LED灯光敏传感器控制蜂鸣器

按键控制LED灯1.1 按键连接示意图1.2 代码设计1.21 设计思路我们要实现按键控制led,我们需要完成LED和按键驱动代码,但如果把这两部分代码都混在主函数里面,那么代码显得过于杂乱,不容易管理和移植,所以对于这种驱动代…

记一次反射型XSS

记一次反射型XSS1.反射型XSS1.1.前言1.2.测试过程1.3.实战演示1.3.1.输入框1.3.2.插入代码1.3.3.跳转链接2.总结1.反射型XSS 1.1.前言 关于这个反射型XSS,利用的方式除了钓鱼,可能更多的就是自娱自乐,那都说是自娱自乐了,并且对系…

Maxscale读写分离实施文档

Maxscale介绍 MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换。 使用Maxscale无需对业务代码进行修改,其自带的读写分离模块,能够解析SQL语句&…

DD-1/40 10-40mA型【接地继电器】

系列型号: DD-1/40接地继电器 DD-1/50接地继电器 DD-1/60接地继电器 一、 用途及工作原理 DD-1型接地继电器为瞬时动作的过电流继电器,用作小电流接地电力系统高电压三相交流发电机和电动机的接地零序过电流保护。继电器线圈接零序电流互感器(电缆式、母…

Vue动态粒子特效插件(背景线条吸附动画)

目录 效果图: 一、安装: 二、引入 main.js 文件: 三、使用: 四、属性说明: 效果图: 一、安装: npm install vue-particles --save 二、引入 main.js 文件: import VueParticles…

【C++】30h速成C++从入门到精通(多态)

多态的概念多态:通俗来说就是多种心态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态的定义及实现多态的构成条件多态是在不同继承关系的类对象,去调用同意函数,产生了不同的行为&#xff0…

C/C++每日一练(20230307)

目录 1. 国名排序 ★★ 2. 重复的DNA序列 ★★★ 3. 买卖股票的最佳时机 III ★★★ 🌟 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 ​专栏 1. 国名排序 小李在准备明天的广交会,明天有来自世界各国的客房跟他们谈生意&#xff0c…

结合基于规则和机器学习的方法构建强大的混合系统

经过这些年的发展,我们都确信ML即使不能表现得更好,至少也可以在几乎所有地方与前ML时代的解决方案相匹配。比如说一些规则约束,我们都会想到能否把它们替换为基于树的ml模型。但是世界并不总是黑白分明的,虽然机器学习在解决问题…

spring boot actuator 动态修改日志级别

1 日志级别 Spring Boot Actuator包括在运行时查看和配置应用程序日志级别的功能。您可以查看整个列表,也可以查看单个记录器的配置,该配置由显式配置的日志级别和日志框架给出的有效日志级别组成。这些级别可以是: TRACEDEBUGINFOWARNERRORFATALOFFnu…

ruoyi-pro 代码生成api,swagger扫描不到

背景 重新创建一个新的maven工程,按照芋道源码ruoyi-pro官方文档生成代码后,新的maven工程目录下的接口不能被swagger扫描到,swagger-ui不显示新增的maven工程模块下的api。 解决方法 新增maven工程类中,新增swagger扫描配置类…

JavaWeb--用户登录注册案例

用户登录注册案例4.1 需求分析4.2 用户登录功能4.3 记住我-设置Cookie4.4 记住我-获取Cookie4.5 用户注册功能4.6 验证码-展示4.7验证码-校验4.8 测试目标 理解什么是会话跟踪技术掌握Cookie的使用掌握Session的使用完善用户登录注册案例的功能 4.1 需求分析 需求说明&#xf…

循环队列的实现

我们知道队列的实现可以用单链表和数组,但是循环链表也可以使用这两种方式。首先我们来看看单链表:首先使用单链表,我们需要考虑循环队列的一些特点。单链表实现循环队列我们要考虑几个核心问题:首先我们要区别 解决 空 和 满 的问…

一文吃透 SpringMVC 中的转发和重定向

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

CameraLink备忘录

首先来看看MDR26的引脚定义 从正面看进去,插头端,放置成倒梯形。 上排,从左到右,1到13, 下排,从左到右,14到26. 插座端,是镜像对称关系。 从正面看进去,插座端&#xf…

C#开发的OpenRA的游戏主界面怎么样创建4

继续游戏主界面创建的主题, 前面已经说到怎么样找到mainmenu.yaml来显示主界面,也说了怎么样找到各个子控件类。 现在就来仔细分析一下,主界面每一部分的功能。 比如下面这个区域的界面是怎么样创建: 要创建这一小部分的界面显示,也是需要做很多的工作。 因为在这里所有UI…

乐鑫特权隔离机制 #4 | 用户应用程序的安全启动

乐鑫特权隔离机制 系列文章 #4 目录 安全启动 (Secure boot) 受保护应用程序的安全启动 (Secure boot for protected app ) 用户应用程序的安全启动 (Secure boot for user app) 基于证书的验证方案 (Certificate-based verification scheme) 必要条件验证过程​​​​​…

数据模型(上):模型分类和模型组成

1.模型分类 ​ 数据模型是一种由符号、文本组成的集合,用以准确表达信息景观,达到有效交流、沟通的目的。数据建模者要求能与来自不同部门,具有不同技术背景,不同业务经验,不同技术水平的人员交流、沟通。数据建模者要了解每个人员的观点,并通过反馈证明理解无误,最终作…