手把手交叉编译mysql
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 进行安装,即可在设置的安装路径找到相应的文件。
相关文章:
手把手交叉编译mysql
1.下载mysql(注意下载boost版本,这样会少一步编译) 下载mysql的时候一定要看好交叉编译工具链的版本。因为mysql 8.0需要的工具链版本较高,所以有可能不支持 查看链接如下: MySQL :: MySQL 8.0 Reference Manual :: …...
升压模块直流隔离低压转高压稳压电源5v12v24v转50V100V110V150V200V250V400V500V600V800V1000V
特点效率高达80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度: -40℃~85℃阻燃封装,满足UL94-V0 要求温度特性好可直接焊在PCB 上应用HRB W2~40W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、9~18V、及18~36VDC标准&…...
LeetCode:977 有序数组平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 […...
JAVA环境配置多个环境(全,详细,简单)
下载java包:https://www.oracle.com/java/technologies/downloads (8版本稳定) 直接无脑安装java程序 (包括jdk-开发与jre-运行) 接下来是java环境配置: 创建系统变量 (用户变量也可以&#…...
10 Seata配置Nacos注册中心和配置中心
Seata配置Nacos注册中心和配置中心 Seata支持注册服务到Nacos,以及支持Seata所有配置放到Nacos配置中心,在Nacos中统一维护; 高可用(集群)模式下就需要配合Nacos来完成: 具体配置如下 注册中心 Seata-server端配置注册中心,…...
[数据库]表的增删改查进阶
●🧑个人主页:你帅你先说. ●📃欢迎点赞👍关注💡收藏💖 ●📖既选择了远方,便只顾风雨兼程。 ●🤟欢迎大家有问题随时私信我! ●🧐版权:本文由[你帅…...
Kubernetes调度之Pod亲和性
Kubernetes调度中的Pod亲和性abstract.pngPod亲和性节点亲和性,是基于节点的标签对Pod进行调度。而Pod亲和性则可以实现基于已经在节点上运行Pod的标签来约束新Pod可以调度到的节点。具体地,如果X上已经运行了一个或多个满足规则Y的Pod,则这个…...
建立相关在线社群的3个简单步骤
在线社群管理和社交媒体营销通常被视为一回事。虽然社群管理确实是社交媒体营销的一个关键部分,但它的意义超越了社交媒体的内容发布。因此,在线社群对于企业的数字营销十分重要。创建、维护和发展社群不是一件容易的工作,也不是一个快速的过…...
安全运营的新模式
安全运营的新模式是传统安全运维的扩展和升级,其实现落地需要管理和技术两斱面同时支撑、相互衎接和配合,缺夰仸何一个都是行不通的。管理斱面,在顶层设计时,网络安全运营要根据国家信息安全等级保护 2.0 的相关要求,参…...
Day10-网页布局实战CSS3
一 补充 1 画三角形 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…...
代码规范(C/C++规范)
文章目录前言个人编写的代码规范链接请求合作大体章节END前言 什么是代码规范 一套用于统一代码开发的准则 为什么需要代码规范 提升代码可读性,提升团队效率 个人编写的代码规范 近期本人编写了一份以C/C为主的代码规范。 其他语言开发者也可以阅读参考。 本…...
春招冲刺(九):计算属性和监视属性总结
计算属性和监视属性总结 Q1:计算属性 姓:<input type"text" v-model"firstName"><br><br> 名:<input type"text" v-model"lastName"><br><br> 姓名ÿ…...
数据挖掘(作业1)
实验开始前先配置环境 以实验室2023安装的版本为例: 1、安装anaconda:(anaconda自带Python,安装了anaconda就不用再安装Python了) 下载并安装 Anaconda3-2022.10-Windows-x86_64.exe 自己选择安装路径,其他使用默认…...
【UE4 RTS游戏】01-项目准备
步骤新建一个工程,选择俯视角游戏模板我命名工程如下:删除场景内的所有cube再删除Floor和Wall删除TopDownCharacter删除“NavgationMeshBoundVolume”删除“TamplateLabel”和“RecastNavMesh-Default”删除LightmassImportanceVolume、PostProcessVolum…...
登录系统账号检测--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
实例8:登录系统账号检测 登录系统一般具有账号密码检测功能,即检测用户输入的账号密码是否正确。若用户输入的账号或密码不正确,提示 “用户名或密码错误”和“您还有*次机会”; 若用户输入的账号和密码正确,提示“登…...
CentOS8基础篇12:使用RPM管理telnet-server软件包
一、RPM包管理工具简介 RedHat软件包管理工具(RedHat Package Manager,RPM) RPM软件包工具常用于软件包的安装、查询、更新升级、校验、卸载以及生成.rpm格式的软件包等操作。 RPM软件包工具只能管理后缀是.rpm的软件包。软件包的命名格式: 软件名称…...
IT女神文章记录之自己
匆匆时光,一转眼自己已经从一个学生转变成一个职场工作者了刚出校园的时候,对职场充满了憧憬,觉得自己可以大展身手然后其实在我毕业后2年内,踏入码农阶段的时候,是一段非常压抑的工作,不知道谁能体会到那种…...
Compose 动画 (四) : AnimatedVisibility 各种入场和出场动画效果
AnimatedVisibility中的EnterTransition 和 ExitTransition ,用来配置入场/出场时候的动画效果。 默认的入场效果是 fadeIn() expandVertically() 默认的出场效果是 fadeOut() shrinkVertically() 1. EnterTransition和ExitTransition支持的动画 enter的参数类…...
notepad++学习小技巧
不要小瞧了notepadd 这个可是我们的cv好帮手。。。 实战1背景,我找一个同事要表结构 结果他给我了一个xml。顿时一懵,我也不知道为啥好像是从前端扣下来的。 建表我只需要 columnName, displayName当作是comment, dataTypeNamecolumnType借鉴…...
Android supports-screens 屏幕适配
基本概念 supports-screens用于设置屏幕相关,处于Manifest的子标签中。 使您能够指定应用支持的屏幕尺寸,并为比应用支持的最大屏幕还大的屏幕启用屏幕兼容性模式。请务必始终在应用中使用此元素指定应用支持的屏幕尺寸。 注意:建议不要在屏…...
操作系统基础知识介绍之Mixed CriticalitySystems——混合关键系统
一、发展背景 在嵌入式场景中,虽然Linux已经得到了广泛应用,但并不能覆盖所有需求,例如高实时、高可靠、高安全的场合。这些场合往往是实时操作系统 的用武之地。有些应用场景既需要Linux的管理能力、丰富的生态又需要实时操作系统的高实时、…...
【数据结构初阶】详解链表OJ题
目录一.删除链表中等于给定值的节点二.合并有序链表并返回三.链表的回文结构1.反转单链表2.返回非空链表的中间节点四.输出链表倒数第K个节点五.基于给定值x分割单链表六.返回两个链表的第一个中间节点一.删除链表中等于给定值的节点 我们先来看第一题(题目链接): 因为我们需…...
Java基本数据类型变量自动提升、强制类型转换、String基本类型使用
文章目录基本数据类型变量自动提升特殊情况强制类型转换String基本类型使用基本数据类型变量自动提升 规则: 将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型 。 byte、short、char-->int-->…...
Redis锁与幂等性不得不说的故事
前言: 相信很多小伙伴对缓存锁都不陌生,但是简单的缓存锁想要用好还是需要一些功力。本文总结了笔者多年使用缓存所的一些心得,欢迎交流探讨~ 幂等模型: 幂等场景一般由查重写入两步操作组成,两步操作组成一个最小完…...
Spark 应用调优
Spark 应用调优人数统计优化摇号次数分布优化Shuffle 常规优化数据分区合并加 Cache优化中签率的变化趋势中签率局部洞察优化倍率分析优化表信息 : apply : 申请者 : 事实表lucky : 中签者表 : 维度表两张表的 Schema ( batchNum,carNum ) : ( 摇号批次,…...
synchronized 与 volatile 关键字
目录1.前言1.synchronized 关键字1. 互斥2.保证内存可见性3.可重入2. volatile 关键字1.保证内存可见性2.无法保证原子性3.synchronized 与 volatile 的区别1.前言 synchronized关键字和volatile是大家在Java多线程学习时接触的两个关键字,很多同学可能学习完就忘记…...
【0成本搭建个人博客】——Hexo+Node.js+Gitee Pages
目录 1、下载安装Git 2、下载安装Node.js 3、使用Hexo进行博客的搭建 4、更改博客样式 5、将博客上传到Gitee 6、更新博客 首先看一下Hexo的博客的效果。 1、下载安装Git Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本…...
【面试实战】认证授权流程及原理分析
认证授权流程及原理分析 1、认证 (Authentication) 和授权 (Authorization)的区别是什么?2、什么是Cookie ? Cookie的作用是什么?如何在服务端使用 Cookie ?3、Cookie 和 Session 有什么区别?如何使用Session进行身份验证?1、认证 (Authentication) 和授权 (Authorizatio…...
TPM命令解析之tpm2_startauthsession
参考网址链接:tpm2-tools/tpm2_startauthsession.1.md at master tpm2-software/tpm2-tools GitHub 命令名称 tpm2_startauthsession 功能 启动一个TPM会话。 命令形式 tpm2_startauthsession [OPTIONS] 描述 启动一个TPM会话。默认是启动一个试验(…...
第14章 局部波动率模型
这学期会时不时更新一下伊曼纽尔德曼(Emanuel Derman) 教授与迈克尔B.米勒(Michael B. Miller)的《The Volatility Smile》这本书,本意是协助导师课程需要,发在这里有意的朋友们可以学习一下,思…...
找个人做网站开不出发票怎么办/排名第一的手机清理软件
在类中的位置不同 成员变量:在类中方法外局部变量:在方法定义中或者方法声明上在内存中的位置不同 成员变量:在堆内存(成员变量属于对象,对象进堆内存)局部变量:在栈内存(局部变量属…...
仿网站百度会怎么做/青岛快速排名
今天早上同事打电话说日照业务库第二个节点登录不进去,业务没法使用,weblogic第二个节点测不通。 PLSQL登录就死住,最后是end-of-communcation chanel ,估计出现了严重的数据库故障。 telnet进AIX小机,crs_stat状态,发现第二个节点为unkown,用命令crs_s…...
滨州 网站开发/厉害的seo顾问
[转]do_select()函数分析,理解select(),poll(),poll_wait()函数的关系 2013-10-4阅读282 评论0 Select函数实现原理分析(转载)select需要驱动程序的支持,驱动程序实现fops内的poll函数。select通过每个设备文件对应的poll函数提供…...
网站建设具体流程图/竞价推广开户多少钱
单文件版的perl程序只能用于构建较小的脚本程序。当代码规模较大时,应该遵循下面两条规则来构建程序。这样能将程序的各个部分按功能一个一个地细化,便于维护,也便于后续开发。 能复用的代码放进函数 能复用的函数放进模块 名称空间和包 名称…...
临海企业网站建设公司/广告投放运营主要做什么
前言 现实就是,99%的职业,年龄增大后都没前途。没前途是绝大多数普通人的宿命,有前途的人也用不着等到老。有没有前途已然不重要,无论做哪一行,健康的心态永远是首位。 从我个人的角度写写30多岁码工的感受ÿ…...
道真县城乡建设局网站/成都最好的seo外包
什么是Eureka 实现 项目结构说明 whotw-springcloud 【project 1】 ——whotw-basics 【module 2 <packaging>pom</packaging>】 ————whotw-eureka 【module 3 <packaging>jar</packaging>】 ——whotw-start 【module 4 <packaging>jar<…...