欢迎来到皮皮网网首页

【Android棍子英雄源码】【冒险岛143 源码】【666源码交易网】cpio源码

来源:学习前端源码 时间:2024-12-29 13:02:05

1.mysql-odbc编译
2.手把手教你搭建ARM64 QEMU环境
3.如何编译android userdata.img
4.initrd和initramfs的区别

cpio源码

mysql-odbc编译

       近期工作中需要编译mysql-odbc的源码驱动库,以下为遇到的源码问题及解决方法。

       首先,源码参照官网指南进行操作:MySQL :: MySQL Connector/ODBC Developer Guide :: 4.5 Building Connector/ODBC from a Source Distribution on Unix。源码

       由于之前未接触过,源码对基本概念不甚了解。源码Android棍子英雄源码

       首先,源码需要配置好依赖项目,源码如libmysqlclient.a。源码系统配置中需包含iodb或unixODBC。源码指南中已明确说明。源码

       为使用静态库,源码我下载了mysql-8.0.编译的源码libmysqlclient库。

       解压.src.rpm文件:命令 rpm2cpio ***.src.rpm | cpio -idv。源码

       解压后,源码会有对应版本的mysql-8.0..tar.gz。注意,这里有boost版本,编译时可能需要指定boost路径。创建build目录,进入build目录后进行以下操作:

       cmake -DWITH_BOOST="/root/lq_workspace/mysql-5.7./boost" ../

       然后执行make和make install。冒险岛143 源码注意mysql的安装路径,以便后续编译odbc时使用。例如,我将其放置在/usr/local/mysql/lib中。

       接下来,开始编译ODBC:

       1. 下载源码,注意编译版本所需的gcc和g++版本。我选择较低版本,非最新版本。

       2. 解压后,666源码交易网创建build路径,开始编译。注意以下参数:

       cmake ../ -DWITH_UNIXODBC=1 -DDISABLE_GUI=1 -DMYSQL_DIR="/usr/local/mysql/" -DMYSQLCLIENT_STATIC_LINKING=true

       编译时出现定义冲突,我将CMakeLists.txt中不需要的部分屏蔽。

       cmake时-DWITH_UNIXODBC=1指定使用unixOdbc,默认为iodbc,需在系统上先配置。

       -DMYSQL_DIR="/usr/local/mysql/"表示安装libmysqlclient的路径。

       -DMYSQLCLIENT_STATIC_LINKING=true连接静态库,默认为动态库。当天量比公式源码

       构建完成后,提示连接libmysqlclient_r.a,低版本区分多线程支持,高版本无需区分。为连接,创建软连接:

       ln -s /usr/local/mysql/lib/libmysqlclient.a /usr/local/mysql/lib/libmysqlclient_r.a

       准备完成后,执行make生成所需odbc驱动。

       配置mysqlodbc后,即可连接mysql。

       总结:编译源码时,金钻启动源码公式会遇到各种版本依赖问题,需逐一排查。同时,编译时的编译可选项作用也不容忽视。

手把手教你搭建ARM QEMU环境

       在上篇介绍了ARM QEMU环境搭建过程后,让我们继续学习如何搭建ARM QEMU开发环境。

       首先,准备开发环境:

       你的PC系统:Windows

       虚拟机软件:VMware

       虚拟机操作系统:Ubuntu .

       目标模拟的位CPU:Cortex-A

       使用版本:qemu-8.2.0、Linux Kernel 5..和busybox-1..1

       构建步骤如下:

       从qemu官网下载并解压qemu-8.2.0源码。

       确保你的主机Python版本大于3.8,如需升级,访问python官网下载源码。

       安装所需的Python依赖和glib2.0环境。

       进入qemu目录,配置源码,创建编译目录并进行配置。

       从kernel.org获取Linux kernel 5.源码,解压并编译生成Image文件。

       同时,编译kernel modules,存放在指定目录。

       使用busybox制作根文件系统:下载最新版本源码,设置交叉编译工具链,重新配置并安装。

       创建rootfs目录,将busybox安装内容复制到其中,包括设置环境变量和设备节点。

       在/etc/init.d/rcS脚本中,rcS会挂载文件系统、处理热插拔和设置eth0的静态IP。

       理解并配置其他配置文件如/etc/fstab和/etc/profile。

       如果需要,可以尝试基于ram的内存文件系统,使用cpio工具制作initramfs或gzip压缩。

       如果需要持久化,制作基于硬盘的文件系统。

       最后,使用qemu命令启动内核并通过串口登录。

       对于更详细的步骤和示例,可以参考我的文章《Linux随笔录》,回复关键字"busybox"获取相关资源。作者潘小帅,热衷于Linux底层技术,喜欢分享原创文章,也欢迎关注微信公众号Linux随笔录,一同探讨技术与生活。感谢您的支持和关注!

如何编译android userdata.img

       1、android文件系统的结构

       android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。因此,我们可以把ramdisk.img里的所有文件复制出来,system.img和userdata.img分别解压到 ramdisk文件系统中的system和 userdata目录下。

       2、分离android文件系统出来

       system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip压缩的,可以通过file命令验证:

       file ramdisk.img,输出:

       ramdisk.img: gzip compressed data, from Unix, last modified: Wed Mar ::

       Android源码编译后除了生成system.img,userdata.img之外还生成system和 userdata文件夹,因此不需要解压它们。Android源码编译后还生成root文件夹,其实root下的文件与 ramdisk.img 里的文件是一样的,不过这里还是介绍怎样把 ramdisk.img解压出来:

       å°†ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令

       gunzip ramdisk.img.gz

       ç„¶åŽæ–°å»ºä¸€ä¸ªæ–‡ä»¶å¤¹ï¼Œå«ramdisk吧,进入,输入命令

       cpio -i -F ../ramdisk.img

       è¿™ä¸‹ï¼Œä½ å°±èƒ½çœ‹è§å¹¶æ“ä½œramdisk里面的内容了。

       ç„¶åŽæŠŠAndroid源码编译后生成的system和 userdata里的文件复制到 ramdisk/system和 ramdisk/userdata下。这样就得到一个文件系统了。

       3、使用网络文件系统方式挂载android文件系统

       å› æ­¤ï¼Œæˆ‘们需要建立/nfsroot目录,再建立/nfsroot/androidfs目录,把刚才的android文件系统改名为androidfs,并链接到/nfsroot/androidfs

       4、android内核引导文件系统

       android内核挂载/nfsroot/androidfs之后,根据init.rc,init.goldfish.rc来初始化并装载系统库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:

       1)设置一些环境变量

       2)创建system、sdcard、data、cache等目录

       3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals

       4)设置一些文件的用户群组、权限

       5)设置一些线程参数

       6)设置TCP缓存大小

initrd和initramfs的区别

       Linux内核在初始化之后会执行init进程,而init进程会挂载我们的根文件系统,但由于init程序也是在根文件系统上的,所以这就有了悖论。Linux采用两步走的方法来解决这个问题。

       Linux2.6版以前的方法是:除了内核vmlinuz之外还有一个独立的initrd.img映像文件,其实它就是一个文件系统映像,linux内核在初始化后会mount initrd.img作为一个临时的根文件系统,而init进程就是在initrd.img里的,然后init进程会挂载真正的根文件系统,然后umount initrd.img。但Linux2.6内核的实现方式却不太一样,虽然完成的功能是一样的。Linux2.6采用initramfs。

       initramfs:init ram filesystem,它是一个cpio格式的内存文件系统,制作的方法有两个,一个是介绍的,但这样做出来的initramfs是和内核vmlinuz分开的,因此我们需要在grub里写上initramfs的路径。而另一种方法是把内核和initramfs制作在一起成为一个文件,方法是在linux源码make menuconfig,然后General setup-->选择Initial RAM filesystem and RAM disk (initramfs/initrd) support,然后在Initramfs source file(s)里输入我们的initramfs目录,然后make bzImage。这种方法做出来的内核就只有一个文件,不需要指定initramfs了。