天道酬勤,学无止境

关于SQLite3 编译及交叉编译的一些问题

转自:http://blog.sina.com.cn/s/blog_5f2e119b0101ibwn.html

SQLite3 (http://www.sqlite.org)是一个非常强大的小型开源数据库软件,特别嵌入到一些软件中存储数据,当然,移植到嵌入式系统上也是非常有必要的。众所周知的Symbian,Android, IOS这几大移动平台都是使用的sqlite作数据存储,使用SQLite的厂商包括Adobe, Airbus, Apple, Dropbox, Mozilla, GE, Google, McAfee, Microsoft, PHP, Python, Toshiba等等。目前SQLite的赞助商包括Oracle, Adobe, Mozilla等。官网的介绍在这里http://sqlite.org/about.html。

    优点:
      1、体积非常小巧,shell版的可执行文件仅600K左右,所有运行库加起来也不过3M多。
      2、性能很好,和mysql相比性能完全不在其之下。
      3、整个数据库存储在一个单一的文件里,备份恢复都非常容易。
      
    缺点:
      对于并发的支持不好,其对于数据库的读写是完全加锁的。




   本文中系统平台为ubuntu 12.04.1 LTS,开发板为s3c2440实验箱,使用的交叉编译器为3.4.6版。

   在ubuntu虽然可以通过
      sudo apt-get install sqlite3
   来安装源里面的sqlite3,不过却不是最新版,之所以不用源里面安装的版本不仅仅是因为那个版本有点老,而且有个很关键的问题,sqlite3只有在3.7.11之后的版本才支持insert into table_name values(),(),()这种方式来一次性插入多条数据,而源里面的版本是3.7.4的版本并不支持这个特性,所以用起来就很不方便,故选择了自己编译。本文以官网最新的3.7.14.1版为例。


   sqlite3官网提供了两种源代码的方式,一种叫作amalgamation,另外一种叫作autoconf,这两种源码包有点不一样。amalgamation的源码包是把sqlite的所有源文件都集成到了sqlite3.c这一个文件里面去,而且这个包只适合单独编译出一个shell版本的sqlite3,它并不会编译出linux里面常见的开发库(也就是基于sqlite3编写的软件必须要依赖的sqlite3库)。而autoconf版就很明显了,是使用linux上面常见的./configure make make install方式来编译sqlite3的,可以编译出所有需要的依赖库。虽然sqlite官方建议使用amalgamation包,但经过个人测试,使用autoconf的包对于sqlite开发者来说是必须的,对于ARM的交叉编译来说就更是如此了。



   Amalgamation包编译shell版sqlite3:
      解压了下载下来的amalgamation的压缩包之后,进入目录,执行

         gcc -o sqlite3 shell.c sqlite3.c -lpthread -ldl

      大约要10到20秒时间即可编译出来一个可用的shell版sqlite3。之所以不推荐使用amalgamation包,是因为使用这个包始终无法编译出支持上下键选择历史命令记录的功能,即使是安装了libreadline-dev包并且加上-lreadline编译参数也不可以,如有人能告诉我原因,不甚感激。



   Autoconf包编译sqlite3及其开发库:
      在编译之前,还需要安装libreadline库,用以实现sqlite3按上下方向键实现重现历史命令记录的功能,此包不大,500k左右。(当然,ubuntu下面做开发必须要安装的build-essential, libncurses5-dev, autoconf, automake这些基本包就不说了)

         sudo apt-get install libreadline-dev

      安装好libreadline之后,执行如下命令编译并安装sqlite及开发库:

         sudo ./configure
         sudo make
         sudo make install

      在执行完./configure之后,注意观察一下输出的结果,在靠后的部分,可以看到这样的输出:
         checking for library containing tgetent... -lncurses
         checking for library containing readline... -lreadline
         checking for readline... yes
      
      如果没找到lncurses和lreadline这两个库,readline肯定就是no了,多半编译完成之后的sqlite3不会支持按上下键调出历史命令记录这个实用功能。
      执行完这三条命令之后,sqlite3就已经被默认安装到了/usr/local/bin里面去了,但是还没完呢,如果在终端直接执行一下sqlite3,多半会报错,类似于这样:

         SQLite header and source version mismatch
         2011-11-01 00:52:41 c7c6050ef060877ebe77b41d959e9df13f8c9b5e
         2012-10-04 19:37:12 091570e46d04e84b67228e0bdbcd6e1fb60c6bdb

      这个问题是因为ubuntu里面原来自带了一个老版的sqlite运行库,这个库由一个库文件和一个符号链接组成,位于/usr/lib/i386-linux-gnu目录,分别是libsqlite3.so.0.8.6和一个符号链接到它的libsqlite3.so.0,由于上面进行的autoconf包的sqlite3并不是静态编译,所以就会出现库不匹配的情况而程序拒绝执行的问题了。
      由于不知道系统自带的那个老版的sqlite库还会不会有用,我们就留着它:
         mv /usr/lib/i386-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/i386-linux-gnu/libsqlite3.so.0.8.6_bak
      然后把刚才编译好的autoconf包里面的这个库复制过去:
         cp .libs/libsqlite3.so.0.8.6 /usr/lib/i386-linux-gnu
      
      OK,现在执行一下sqlite3,完全没有问题了(如果前面没有安装libreadline和libncurses5-dev库,按上下方向键就没有显示历史命令记录这个实用功能),同时其开发库也已经安装到系统里了。





   下面是交叉编译sqlite所有相关文件的问题。

      由于是交叉编译,所以一些相关的依赖库,比如libreadline和libncurses就不能直接安装到系统里面了(安装了也没用不会被交叉编译器识别),而是应该安装到交叉编译器的目录中。
      先分别去下面这两个地方下载libreadline和ncurses的源码包(之所以要安装ncurses库是因为libreadline依赖于它,而且很多linux的软件都会用到这个库),注意是下载.tar.gz为扩展名的包,一般都是下载最新版的。
http://ftp.gnu.org/gnu/readline/
http://ftp.gnu.org/gnu/ncurses/
      分别交叉编译这两个包:
      
         sudo ./configure --host=arm-linux --prefix=/opt/
         sudo make
         sudo make install

      --host接的是arm的交叉编译器的名称,--prefix接的是编译好之后安装到的路径,这里建议不要直接安装到交叉编译器的路径,而是安装到其它地方,等安装完之后到目标目录确认一下之后再手动拷到交叉编译器的目录里面去。

      待两个包编译安装完之后,还要手动拷到交叉编译器的路径里面去,这里我以安装在/usr/local/arm/3.4.6目录里面的3.4.6版本的交叉编译器为例。进入到刚才编译安装好的那两个包的目录,里面应该有bin include share lib等目录,在那个目录里面,执行如下命令

         sudo cp -pR * /usr/local/arm/3.4.6/arm-linux

      这里有两个个人认为需要注意的问题。
      1. cp -p的参数是复制文件的属性、拥有者、符号链接等所有属性,而-R是递归复制,也就是拷贝下面的所有目录和文件过去。而目标目录并不是/usr/local/arm/3.4.6,而是其下面的arm-linux这个目录,需要注意一下。当然3.4.6版本的交叉编译器是这样子的,别的版本的交叉编译器请自行参考。
      2. 这两个库不仅要安装到交叉编译器里面去,更是建议把它安装到开发板的根文件系统里面去,因为个人的2440的根文件系统是用nfs挂在pc上的,所以只要用cp -pR把所有东西直接拷过去就行了,其它方法做的根文件系统请自行想办法解决。至少需要把libreadline的库拷到根文件系统里面去,不然交叉编译好的sqlite3会因为缺少libreadline的库而拒绝执行。


      在上面的工作都准备好之后,进入以sqlite3-autoconf的目录里面去,执行:

         sudo ./configure --host=arm-linux --prefix=/opt/sqlite3
      
      这个configure的参数跟上面的编译readline和ncurses是一样的意思,跟上面在pc上configure之后输出的信息一样,也要找到有-lncurses和-lreadline且readline为yes的时候,才能正常启用上下键调出命令记录的功能。

      然后执行
         sudo make
         sudo make install

      安装完成之后,再把安装目录里面的所有文件都拷到开发板的根文件系统里面去,用minicom连接到2440的linux,执行一下sqlite3这个程序,如果你是按上文来做的话,应该不会有问题,而且可以支持上下键显示历史命令记录这个实用功能了。

      另外还有一个比较有意思的问题,如果不给交叉编译器加上ncurses和readline这两个库的支持,直接用上面的configure来生成makefile,make之后将会有有个错误无法通过编译,只能手动去改makefile,好像是Makefile有个地方多了个斜杠,把那个斜杠去掉之后就可以编译通过了。但是把交叉编译器打上ncurses和readline库之后,这个错误就不会再出现了。


   再下面就是做sqlite3应用开发的编译上的小问题了。

      在pc上写完代码之后编译的时候使用的选项应该是这样的:
         gcc -o name name.c -lsqlite3
      最后那个-lsqlite3是引用sqlite3的开发库。

      而交叉编译的时候就有些不一样了:
         arm-linux-gcc -o name name.c -I /opt/sqlite3/include -L /opt/sqlite3/lib -lsqlite3
      -I接的是交叉编译后安装的arm版的sqlite3目录里面的头文件,而-L则是包含的库文件。

      这样的编译选项编译之后,拷到开发板上去,执行,OK!

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • sqlite3在嵌入式Linux上的移植步骤详解
    深入理解SQLite3之sqlite3_exec及回调函数 sqlite3:深入理解sqlite3_stmt 机制 sqlite3: sqlite3_step 函数 sqlite3:sqlite3_bind 函数 sqlite3:sqlite3_column 函数 sqlite3:嵌入式linux下使用总结 在前面的文章中,对sqlite3进行了一些零碎知识点分析, 本文分析一下sqlite3如何在嵌入式Linux上进行移植使用。sqlite3作为一种跨平台可移植的轻型 数据库,非常适合在嵌入式linux下使用,由于嵌入式linux主要使用ARM芯片,所以相比较PC,运算能力和内存 较差。sqlite3在嵌入式linux下运行,主要是以一个独立的应用程序来运行的,这也就意味着,当我们将sqlite3编译生成的 可执行程序 sqlite3 (包括必要的动态库)拷贝到 ARM平台后,是可以直接作为一个普通的应用程序来操作执行的,也就是相当于 一个小型的数据库,只不过我们与sqlite3交互是通过shell命令来实现的。当然这个数据库提供API接口,我们在自己的工程中,包含相关的头文件,就可以直接调用API接口函数, 实现与sqlite3的交互。 sqlite3在嵌入式Linux ARM 平台的移植步骤如下: 0、我的开发环境为ubuntu,交叉编译环境为 arm-linux
  • sqlite3交叉编译
    1、交叉编译sqllite3可以先从官网下载最新最新的源码进行编译。sqlite3下载sqlite3有两种版本的源代码,sqlite-amalgamation-3300100.zip这种是将所有的操作放到sqlite3中进行使用的。虽然官方推荐使用这种方法。但是对于嵌入式移植还是使用sqlite-autoconf-3300100.tar.gz自动配置编译成so库来使用比较方便。 2、首先使用tar xzvf sqlite-autoconf-3300100.tar.gz解压源码。 3、进入解压后的目录。 4、./configure CC=/opt/poky/1.6.1/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc --host=arm-linux --prefix= /usr/tmp/ 说明:CC赋值为嵌入式开发环境所使用的交叉编译工具,–host指定软件运行环境为arm-linux, --prefix指定源码交叉编译后生成文件的路径。 5、使用make和make install安装编译好的sqlite3的动态库。 6、将在 /usr/tmp/lib 目录下生成的 libsqlite3.so libsqlite3.so.0 libsqlite3.so.0
  • 交叉编译sqlite3生成动态库
    1、下载源码,解压; 2、执行./configure --host=arm CC=arm-linux-gnueabi-gcc --prefix=/usr 3、执行make,生成可执行文件及静态库文件; 4、执行arm-linux-gnueabi-strip sqlite3命令,去掉调试信息; 5、执行sudo make install命令,将文件拷贝至安装目录; 6、生成动态库:arm-linux-gnueabi-gcc sqlite3.c -lpthread -ldl -fPIC -shared -o sqlite3.so 来源:https://blog.csdn.net/u012844475/article/details/103815549
  • linphone arm交叉编译过程记录
    Linphone交叉编译过程: 在centos7上交叉编译海思版本linphone (origin/release/4.2)使用过程: 经常需要执行命令: find . -name “*.sh”|sudo xargs chmod +x 配置命令: ./configure --host=arm-linux --prefix=/home/app_comm/arm-compile/armlib/ CC=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc 编译使用命令: ./prepare.py desktop-raspberry -DENABLE_OPENH264=ON -DENABLE_WEBRTC_AEC=OFF -DENABLE_UNIT_TESTS=OFF -DENABLE_MKV=OFF -DENABLE_FFMPEG=ON -DENABLE_CXX_WRAPPER=OFF -DENABLE_NON_FREE_CODECS=ON -DENABLE_VCARD=OFF -DENABLE_BV16=OFF -DENABLE_V4L=OFF 使用linphone提供的树莓派版本编译的方式,但是树莓派arm版本和海思arm版本不太一致,所以部分cmake配置需要手动修改 Arm版本信息: 执行
  • 嵌入式Linux开发之环境搭建(四)
    交叉编译器及Linux下的第一个C程序 一、前言二、Linux下的C程序编写三、gcc编译器四、交叉编译器 一、前言 在前几篇中主要介绍了VMware虚拟机、Ubuntu操作系统以及VMware tools的安装及使用,这对我们以后想要做嵌入式linux开发毫无疑问是打下了重要基础。接下来,将会继续介绍如何编写第一个linux下的C程序?什么是gcc编译器?如何编译运行所编写的C程序? 二、Linux下的C程序编写 到目前为止,嵌入式linux开发的软件环境差不多搭建好了,现在就可以编写Linux下的C程序,跟Windows下编写C程序是一样的。 1、建立一个test.c的文件 2、添加头文件 #include <stdio.h>//标准输入输出 3、编写主函数 int main(void) { printf("Hello Linux!!!\n"); return 0; } 到此,一个简单的linux下C程序就写好了,那么我们怎么将写好的.c文件编译运行呢? 三、gcc编译器 gcc原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件
  • anzhuang sql
    环境Linux 操作系统: Fedora 16内核:3.1sqlite 版本:3.7.13 目录1.编译与安装1.1下载sqlite源码1.2编译与安装2.sqlite数据库管理3.sqlite数据库编程参考 1.编译与安装 1.1下载sqlite源码 官网下载地址 http://www.sqlite.org/download.html 选择下载项:Source Codesqlite-autoconf-3071300.tar.gz (1.76 MiB) 下载得到文件sqlite-autoconf-3071300.tar.gz 1.2编译与安装 解压sqlite压缩文件tar –zvxf sqlite-autoconf-3071300.tar.gz得到文件sqlite-autoconf-3071300 下面的一些操作参考sqlite源文件中的INSTALL文件,这是一份好的安装说明。 进入sqlite-autoconf-3071300目录[root@localhost ~]# cd /home/sqlite-autoconf-3071300/配置[root@localhost sqlite-autoconf-3071300]# ./configure编译[root@localhost sqlite-autoconf-3071300]# make安装[root@localhost
  • SQLite3数据库交叉编译并移植到ARM_v7中运行
    SQLite源码编译安装与运行 首先到官网http://www.sqlite.org/download.html下载linux版本的源码:sqlite-autoconf-sqlite-autoconf-3300100.tar.gz。 执行: wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz解压:tar -zxvf sqlite-autoconf-3300100.tar.gz进入解压后的目录:$ cd sqlite-autoconf-3300100执行: CC=$CC ./configure --host=arm-linux --prefix=/usr/local/ --with-sysroot=/opt/myir-imx-fb-core/4.1.15-2.0.1/ i. $CC为交叉编译工具链,如为空则需要加入到环境变量中source /opt/myir-imx-fb-core/4.1.15-2.0.1/environment-setup-cortexa7hf-neon-poky-linux-gnueabi ii. CC赋值为嵌入式开发环境所使用的交叉编译工具,注:当前我使用的是米尔电子工具链仅供参考 iii. --host指定软件运行环境为arm-linux iv
  • 关于使用Android NDK编译ffmpeg
    由于项目需求,前两天在在ios项目中使用ffmpeg,写下了“关于ios中编译ffmpeg0.9.2库”,然后有朋友在咨询,如何编译最新版的ffmpeg,其实最新版的编译也差不多,只是看看最新版的改变如何,修改一些参数即可,同时又因为我需要将项目跨平台到android,所以这次又需要在android中使用ndk来编译ffmpeg。索性在android上就编译一个最新版的ffmpeg出来看看。 还是先说一下我的环境: mac os x 10.7.4 Eclispe3.7 android-sdk-macosx android-ndk-r7b 1:打开ffmpeg官网(http://ffmpeg.org/download.html),看到最新版是ffmpeg-0.10.3,直接就选择了一个最新版本的zip包下载,然后解压,得到ffmpeg-0.10.3文件夹。 因为在网上也看到很多文章用android ndk来编译ffmpeg,但是整个编译和配置过程都很麻烦,并且大部分朋友反应,编译过程总是会出现很多错误,各种编译不成功的原因,这次我们就来个简单点儿的,但是需要确保android ndk的版本在r5以上。原因请看android ndk目录中的doc/STANDALONE-TOOLCHAIN.html文档,因为Android ndk中的交叉工具链可以将一套完整的工具链从NDK里复制出来
  • 如何准备带有Raspbian的Raspberry Pi,以便可以从Linux主机交叉编译Qt5程序?(How do I prepare a Raspberry Pi with Raspbian so I can cross compile Qt5 programs from a Linux host?)
    问题 我想在Linux上为Raspberry Pi 1设置交叉编译环境。特别是我想尝试最新版本,即Raspbian测试+ Qt5 dev分支。 问题:如何为Raspberry Pi 1创建现代的交叉编译工具链? ...说明如何获得gcc编译器,该编译器可以为Raspberry Pi 1创建代码。Raspbian本身是否需要进行更改才能使用它? 如果是这样,哪个? 回答1 您需要一个完整的工具链 工具链是一起工作以为系统生成二进制文件的一组工具。 这取决于你如何建立你的工具链,它可能在暂时只对功能你自己的形象,这不是,其实是一个问题结束了,你只克隆你的形象,随意升级。 首先,了解您的需求: 功能旗舰系统。 这是您的参考板,参考发行包,包装和材料。 您可能需要标准的Raspbian,也可能需要一些额外的东西,例如OpenCV或更少的东西,例如删除Xorg。 您说您想流血的边缘,所以适合您的口味。 Sysroot 。 理想情况下,这是您的功能旗舰系统的副本,带有添加的开发标头。 在我的情况下,这完全相同,对于Raspbian,这是第二个分区的映像,该分区托管/ 。 交叉编译器。 这是一个在x86或x86_64上运行时为ARM生成代码的编译器。 这通常是专门的gcc 。 交叉编译qmake 。 对于Qt,您需要一个交叉qmake,这是一个qmake
  • QT 单独交叉编译插件sqlite
    第一步 下载QT官方源码 qt-everywhere-opensource-src-5.6.2.tar.gz 下载sqlite3源码 sqlite-autoconf-3300100.tar.gz 第二步 交叉编译 sqlite源码 ./configure --host=arm-linux --prefix=/home/fangxin/sqlite-arm make & make install 完成后在 目录下有 bin include lib share 四个文件夹 注意 我的交叉编译工具链已经是全局默认,不需要额外设置CC 第二不步 进入QT源码目录 cd /home/fangxin/Downloads/qt-everywhere-opensource-src-5.6.2/qtbase/src/plugins/sqldrivers/sqlite /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/qt5/qmake "INCLUDEPATH+=/home/fangxin/sqlite-arm/include/sqlite3" "LIBS+=-L/home/fangxin/sqlite-arm/lib/sqlite3 -lsqlite3" sqlite.pro make 报错 make 的时候出现
  • 交叉编译时如何使用外部库?(How to work with external libraries when cross compiling?)
    问题 我正在x86 ubuntu机器上为树莓派ARM目标编写一些代码。 我正在使用gcc-linaro-armhf工具链。 我能够交叉编译并在pi上运行一些独立程序。 现在,我想将代码与外部库(例如ncurses)链接。 我该如何做到这一点。 我是否应该将程序与主机上现有的ncurses lib链接,然后在ARM上运行? (我认为这行不通)是否需要为arm获取lib的源代码或预构建版本,将其放在我的lib路径中然后进行编译? 在这种情况下的最佳实践是什么? 我也想知道它对于c stdlib是如何工作的。 在我的程序中,我使用了stdio函数,并且在交叉编译后无需进行任何特殊处理即可工作。 我只是在makefile中为我的手臂gcc提供了路径。 所以,我想知道,它是如何获得正确的std标头和库的? 回答1 关于您的一般性问题: C库为何起作用: C库是跨工具链的一部分。 这就是为什么找到标头并且程序正确链接并运行的原因。 对于其他一些非常基本的系统库(例如libm和libstdc ++),也是如此(并非在每种情况下都取决于工具链配置)。 通常,在进行交叉开发时,您需要某种方式来交叉编译所需的库。 在这种情况下,使用二进制文件非常罕见。 也就是说,尤其是对于ARM硬件,因为存在许多不同的配置,并且通常以不同的方式简化所有内容。
  • 迅为IMX6ULL开发板Linux学习教程
    1800+页使用手册(持续更新)+入门视频教程+实战视频教程 关注VX公众号:迅为电子 , 回复 :终结者,免费获取产品资料 让教程更细致,终结入门难! 所有教程由迅为原创,是迅为工作多年的工程师精心编写,深知初学者痛点。从Linux入门到驱动开发再到系统移植,一步一步由浅入深,逐步掌握嵌入式技术。每个例子有详细的注释,每个命令详细的说明。只要你对嵌入式感兴趣,就可以学习。 注意事项与售后维修 2 技术支持与开发定制 4 资料获取与后续更新 5 更新记录 6 前言 开发板使用前必读 31 必须注意的问题 31 一 光盘资料介绍 31 二 开发板使用前装配流程 33 第一部分 总领及学习指引 37 01 框架学习法 38 02 嵌入式系统学习的框架 39 03 关于裸机程序和仿真 41 04 基于迅为开发板的学习步骤 42 第一章 开发板初体验 44 1.1 初识i.MX6ULL终结者开发板 45 1.2 i.MX6ULL终结者硬件资源说明 46 1.2.1 i.MX6ULL核心板资源说明 46 1.2.2 i.MX6ULL终结者底板资源说明 48 1.3 i.MX6ULL终结者底板原理分析 51 1.3.1 核心板接口 51 1.3.2 启动方式原理部分 52 1.3.3 系统电源接口 53 1.3.4 复位电路 54 1.3.5 纽扣电池电路 55 1.3.6 CAN接口电路
  • 在树莓派上搭建kaldi离线语音识别系统(交叉编译)
    在树莓派上搭建kaldi离线语音识别系统(交叉编译) 一、系统功能和环境概述1.1、实现功能1.2、开发环境 二、kaldi语音识别工具箱三、树莓派的相关配置四、kaldi交叉编译过程4.1、配置Ubuntu中的交叉编译环境4.2、kaldi相关依赖工具的交叉编译4.2.1 openFST的交叉编译过程4.2.2 OpenBlas的交叉编译过程4.2.3 clapack的交叉编译过程4.2.4 Alsa的交叉编译过程4.2.5 Portaudio的交叉编译过程 4.3、kaldi的交叉编译 五、kaldi的移植和使用5.1、kaldi移植到树莓派5.2、在树莓派中测试数据堂chain模型 一、系统功能和环境概述 首先感谢博主遇逆境处之泰然撰写的系列文章,本文内容参照该博主文章完成: 参考: 作者: 遇逆境处之泰然 系列文章: kaldi嵌入式平台的移植及实现 1.1、实现功能 最近买了个树莓派,想做一个语音识别智能控制的功能,但是使用各大语音识别厂商提供的在线语音识别接口没有成就感,而且可能还要花钱=_=,干脆就使用Dan大神的开源语音识别框架kaldi来实现;在网上没有发现用树莓派去跑kaldi的相关博客和实例,只能自己来了。本来想着直接将kaldi源码在树莓派中直接编译,但毕竟是嵌入式的平台,很多依赖包和编译文件中会出现各式各样的问题,搞得人头大,所以选择使用交叉编译工具
  • 华为鲲鹏HCIA认证笔记总结四(复习考点附题库)
    道阻且长,行则将至。埋头苦干,不鸣则已,一鸣惊人!加油,骚年! 文章目录 1 参考资料2 笔记总结2.1 华为鲲鹏2.2 TaiShan 服务器2.3 华为云鲲鹏云服务2.4 openEuler2.5 鲲鹏处理器与 X86 处理器的指令差异2.6 编译型语言 & 解释型语言2.7 移植选项2.8 华为鲲鹏代码迁移工具2.9 容器与虚拟机2.10 Docker2.11 TPCC2.12 BenchmarkSQL2.13 HiBench2.14 HPC 性能测试2.15 性能调优分析工具2.16 NUMA2.17 镜像2.18 系统盘2.19 弹性公网 IP2.20 BGP 类型2.21 编译2.22 Linux 安装软件2.23 RPMbuild2.24 华为云发布的鲲鹏行业解决方案2.25 思考题 3 题库分享3.1 资源获取3.2 模拟考试 4 结尾祝福 1 参考资料   在准备考试过程中,参考了很多资料,非常感谢各位前辈的帮助。整理资料链接如下: 【鲲鹏HCIA考试】错题集(https://blog.csdn.net/qq_44745905/article/details/108725463) 鲲鹏云HCIA知识总结(一)(https://blog.csdn.net/qq_43531669/article/details/105271419) 鲲鹏云HCIA知识总结(二)
  • .NET/MONO 交叉编译的最佳实践(Best practices for .NET/MONO cross compiling)
    问题 编写可以在 .NET (windows) 和 Mono (linux) 上交叉编译的代码的最佳实践是什么? 虽然我对 .NET 非常熟悉,但我对 Mono 及其所有问题的经验并不多。 有没有人看过我无法挖掘的关于此的优秀博客文章或最佳实践论文? 我会坚持使用 C# 3.0 级别的功能。 我首先关心的是Interop,因为我需要调用一些本机代码。 接下来是处理诸如 Mono.XXX 之类的名称空间的最佳方法。 我应该使用一堆#if吗? 隔离每个平台程序集中的代码? 任何关于建筑和设计的建议将不胜感激! 如果您有在 Visual Studio(任何版本)中为 Linux/Mono 进行交叉编译的任何经验,我也会对此感兴趣。 回答1 最大的问题是坚持使用 Mono 支持的 API。 在 Mono 中使用 Visual Studio 集成支持对此有很大帮助,因为您可以在所有平台上始终以 Mono 为目标。 对于您的具体问题: 1) 互操作 - 您需要坚持使用 P/Invoke。 尝试将其隔离为单独的、特定于平台的程序集。 这导致2: 2)使用#if - 我会避免这种情况,并且更喜欢使用可扩展性模型。 Mono 支持托管扩展性框架,它提供了一种在运行时“插入”平台特定代码的好方法。 回答2 您应该对 Prebuild 感兴趣: Prebuild 是一个跨平台的 XML 驱动的预构建工具
  • 嵌入式linux 项目开发(一)——SQLite数据库
    嵌入式linux 项目开发(一)——SQLite数据库一、SQLite数据库简介 SQLite是一个开源的嵌入式关系数据库,是一种轻量级的、自给自足的、无服务器的、无需配置的、事务性的SQL数据库引擎,其特点是高度便携、使用方便、结构紧凑、高效、可靠,体积小,支持 ACID(原子性、一致性、独立性及持久性Atomicity、Consistency、Isolation、Durability)事物。 SQLite官网:http://www.sqlite.org/ SQLite数据库采用模块化设计,由8个独立的模块构成,构成三个主要的子系统。SQLite的基本架构: sqlite主要由8个构件子系统(模块)组成,分为两部分:前端解析系统和后端引擎。 前端: 前端预处理应用程序传递过来的SQL语句和SQLite命令。对获取的编码分析、优化,转换为后端能够执行的SQLite内部字节编码并执行。前端可分为5个模块: A、接口(Interface) 所有的SQLite API命名以sqlite3_为前缀,接收SQL语句和sqlite命令 B、标识分析(Tokenizer) tokenizer是负责把SQL语句解析为一个个的“串”,将输入的SQL语句分成标识符。 C、语法分析(Parser) Paser根据tokenizer分割的“串”的前后序列关系来生成相应的语法结构
  • 在Maven中指定Java版本-属性和编译器插件之间的区别(Specifying java version in maven - differences between properties and compiler plugin)
    问题 我对maven不太熟悉,在尝试多模块项目时,我开始想知道如何为父maven pom中的所有子模块指定java版本。 直到今天,我只使用: <properties> <java.version>1.8</java.version> </properties> 但是在研究时,我发现您还可以在maven编译器插件中指定Java版本,如下所示: <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> 然后将其包装到插件管理标签中,以启用子poms用法。 因此,第一个问题是beetwen在属性和maven编译器插件中设置java版本的区别是什么? 我找不到明确的答案,但是在研究过程中,我发现您还可以通过以下方式指定Java版本: <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
  • 为什么我不能安装 SQLite gem?(Why can't I install the SQLite gem?)
    问题 我尝试在带有 Ruby 1.8.6、Rails 2.2.2、gem 1.3 和 sqlite-3.5.9 的 Fedora 9 Linux 机器上安装 SQLite gem。 这是我正在运行的命令及其结果: sudo gem install sqlite3-ruby Building native extensions. This could take a while... ERROR: Error installing sqlite3-ruby: ERROR: Failed to build gem native extension. /usr/bin/ruby extconf.rb install sqlite3-ruby can't find header files for ruby. Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4 for inspection. Results logged to /usr/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4/ext/sqlite3_api/gem_make.out gem_make.out只是重复已经发送到控制台的内容。 我该如何安装这个 gem? 回答1 SQLite
  • 在移值 MIPS64 下的.NET Core 进度速报
    写在开始前我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab issue 中表示官方当前没有对 MIPS 的支持计划。更具体操作系统与 CPU 架构列表见 [Download .NET Core 3.1](https://dotnet.microsoft.com/download/dotnet-core/3.16月下旬,龙芯团队宣布在 dotnet/coreclr 基础上完成了MIPS64 的移植工作 Open-sourcing CoreCLR MIPS64 Port #38069,计划实现 3.x 版本并贡献到上游 dotnet/runtime。按照相关 issue 里的指引,这里对编译了移值工作,进行了一些测试。具体的进度作为下游开发者,想知道距离生产环境使用还有多远,必须先提及 dotnet core 应用程序的发布/部署方式1. dotnet core 支持两种方式的发布/部署独立应用(self-contained)依赖于运行时(runtime-dependent)前者包含可执行文件(exe),无法跨平台;后者生成了跨平台的二进制文件(dll),需要运行环境预先安装好运行时。关于部署策略的详细信息,可以参考.NET Core application
  • 在移值 MIPS64 下的.NET Core 进度速报
    写在开始前我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab issue 中表示官方当前没有对 MIPS 的支持计划。更具体操作系统与 CPU 架构列表见 [Download .NET Core 3.1](https://dotnet.microsoft.com/download/dotnet-core/3.16月下旬,龙芯团队宣布在 dotnet/coreclr 基础上完成了MIPS64 的移植工作 Open-sourcing CoreCLR MIPS64 Port #38069,计划实现 3.x 版本并贡献到上游 dotnet/runtime。按照相关 issue 里的指引,这里对编译了移值工作,进行了一些测试。具体的进度作为下游开发者,想知道距离生产环境使用还有多远,必须先提及 dotnet core 应用程序的发布/部署方式1. dotnet core 支持两种方式的发布/部署独立应用(self-contained)依赖于运行时(runtime-dependent)前者包含可执行文件(exe),无法跨平台;后者生成了跨平台的二进制文件(dll),需要运行环境预先安装好运行时。关于部署策略的详细信息,可以参考.NET Core application