基于x86体系结构openwrt上的libmysqlclient交叉编译

1.建立交叉编译环境

首先,在自己的机子上建立交叉编译环境。

我使用的是Ubuntu14.04 x86_64,gcc-4.8.3。如果要建立一套十分完整的交叉编译环境,需要安装openwrt buildroot环境,操作步骤:

http://wiki.openwrt.org/doc/howto/buildroot.exigence,

注意在其中make menuconfig之后出现配置界面,主要选定目标系统的体系架构,比如我的是x86,其他如ar71xx等,另外选中编译出toolchain,还有一项是打包openwrt SDK(这个很多文档有提到,我们不妨就勾选上吧)。

从make menuconfig界面来看,这个应该是在编译整个openwrt,于是乎像编译其他系统一样,这个过程显得漫长而无聊。我们不妨换个思路,我们一般交叉编译时使用源码包中configure脚本指定--host选项表示要编译的目标平台,如我的i486-openwrt-linux,而根据经验来看,configure是根据这个值,在其后加上-gcc/-g++构成i486-openwrt-linux-gcc/g++形成目标平台的编译器进行调用编译,之后根据所得到的编译器名字在环境变量PATH指定的目录下寻找到。

基于这个经验性原理,我们为什么要等待如此漫长的时间而位于编译的路上呢。好的,我们去openwrt x86的源上直接下载官方已经编译好的编译器,然后设置PATH路径不就好了吗。嗯,在

http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/ 

就可以看到toolchain了,下载之,解压,设置环境变量PATH即可,环境变量一般是$TOOLCHAIN_HOME/bin,这个$TOOLCHAIN_HOME表示你的工具链家目录。

可以测试一下在命令行输入i486-openwrt-linux- 然后按Tab键会不会补全出一大堆东西,如果可以,那就表示PATH设置好了。通过这样的方法,我编译通过了libnet, libpcap, libnids,这个根据我之前记录的文档,编译过程真是如丝般顺滑...... 不过这样的话,这个交叉编译工具链会爆出warning,说没有$STAGING_DIR这个环境变量,其实无视这个没有什么问题,前提是你不需要目标平台的其他库,如果实在不爽的话,可以设置一下,如果设置PATH的时候是$TOOLCHAIN_HOME/bin的话,这个$STAGING_DIR就是$TOOLCHAIN_HOME了。

如果安装了buildroot的话,也是要设置这两个环境变量的,跟上面一样的。

后来在编译另外一个东西的时候要链接pthread库,这个时候就必须用这个完整的buildroot了,编译器将STAGING_DIR指定的路径作为头文件和库的默认目录,应该是用到SDK中的pthread库了。

2.交叉编译libmysqlclient

这个过程可以参考

http://blog.csdn.net/lilongherolilong/article/details/7521736

这个文章,要严格遵守mysql-connector版本,并且参考下面5楼评论。

cmake生成Makefile之后,make进行编译,出现错误

my_global.h:1582:22: error: static declaration of 'rint' follows non-static declaration

这尼玛肯定是和参考文章的编译器版本不一致导致的,可恨原文章关于环境毫无强调,我这的cmake版本是2.8.12.2的,交叉编译器也是基于gcc-4.8.3的。

幸好,通过google发现有人说注释掉它,ok,那我们注释掉它吧。

接下来重新make,眼看着快好了,95%停下来了,观其错误,一看undefined reference,当然就是链接出错了,再看是关于floor,pow,log等函数的未定义引用,问题很明显,没有链接到math库,肯定是链接选项少了-lm。

那么到底是哪一条编译命令呢,从目前的make显示信息上看只能看到进度,和目标文件,错误信息,我们需要的是类似于gcc -o test test.c这样的东西,然后再后边加上-lm。

好的,如果你熟悉make的话,那么事情显得轻而易举,对,就是make VERBOSE=1,显示详情吧,很好,我们发现最后一条出错的命令是这样的:

/home/weizheng/openwrt/staging_dir/toolchain-i386_i486_gcc-4.8-linaro_uClibc-0.9.33.2/bin/i486-openwrt-linux-gcc    -Wall -fno-rtti -fno-exceptions -O3 -DNDEBUG -DDBUG_OFF    CMakeFiles/mysql_client_test.dir/mysql_client_test.c.o CMakeFiles/mysql_client_test.dir/__/mysys/my_memmem.c.o  -o mysql_client_test -rdynamic ../libmysql/libmysqlclient.a -lpthread

哦,原来是这条编译命令后边没有加-lm。好的,我们分析这条命令,发现源文件是

CMakeFiles/mysql_client_test.dir/mysql_client_test.c.o CMakeFiles/mysql_client_test.dir/__/mysys/my_memmem.c.o

但似乎并不在源码直接目录下,因为在源码目录下重新执行命令,会说上面这两个文件不在,那怎么办呢,这个文件到底死到哪里去了呢,好的,如果你熟悉find命令的话,那么这个问题就迎刃而解了。

[email protected]:~/semanalysis/x86_openwrt_lib/mysql-connector-c-6.0.2$ find . -name mysql_client_test.c.o
./tests/CMakeFiles/mysql_client_test.dir/mysql_client_test.c.o

嗯,终于找到这货了,在test目录下,cd进去,执行编译命令,ok,这个就算过了。

退回上层目录,继续make,发现还有别的一样的错误,重复上述过程。当然似乎有一大堆编译命令都没有-lm,难道我们要一个个加上,这尼玛也真有够烦的。

嗯,再次拿出我们的杀手锏,如果你...对make,Makefile够熟悉的话,一般情况下是这样的,make按照Makefile的组织语法解释执行Makefile,好的,再一般情况下,会有一个选项叫LDFLAGS啦,嗯,就是这样,我们直接修改这个LDFLAGS加上-lm不就完事了吗,但是在Makefile中寻找LDFLAGS显然不是一个明智的选择,这么多Makefile,你知道人家放到哪个里面了,幸好,还有这个办法,就是环境变量。

export LDFLAGS+=-lm

之后重新cmake,make就ok了,终于尼玛华丽的成功了,呵呵呵呵...

对了,别忘了make install哦!

================= main =================

魏征WeiZ

时间: 2024-10-05 05:04:51

基于x86体系结构openwrt上的libmysqlclient交叉编译的相关文章

3.2 x86体系结构

计算机组成 3 指令系统体系结构 3.2 x86体系结构 X86是商业上最为成功,影响力最大的一种体系结构.但从技术的角度看,它又存在着很多的问题,那我们就来一起分析X86这种体系结构的特点. 要探讨x86体系结构,我们就得从8086开始说起.8086是英特尔在1978年推出的一款16位的微处理器. 它内部的通用寄存器为16位,对外有16根数据线和20根地址线,因此可以访问的存储单元数量为2的20次方,也就是1MByte.而cpu发到存储器的地址,我们称为物理地址,8086的物理地址采用了段加偏

基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序

1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处.计算机中读取数据的时候是从高地址到低地址,存储数据时候相反! 2.主机字节序到网络字节序 基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的.因而对int.uint16.uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺

Openwrt上mysql innodb的使用及相关异常情况

首先在menuconfig中配置mysql,具体是在Utilities->database->mysql-server.这样直接编译就可以了,不过这样默认是不支持innodb存储引擎的,估计是考虑openwrt一般是运行的硬件有关,不需要这么复杂的存储引擎(占用空间也比MyISAM存储引擎大).但是,如果需要支持innodb存储引擎该怎么办?这类型的网上帖子不多,我是之前参照国外的论坛加自己测试得出的. Openwrt支持innodb存储引擎 修改feeds/oldpackages/libs/

为基于 x86 的 Android* 游戏选择合适的引擎

摘要 游戏开发人员知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中,它们所占的比例超过 90%). 如要跻身该市场,开发速度非常关键. 一些刚起步的独立开发人员更愿意从零开始来开发自己的所有代码:但是为了达到更高的质量而不用花费数年的时间进行开发,其他人可能会选择已有的游戏引擎. 在选择引擎时,你可以考虑以下几个因素: 成本 - 你计划支出多少费用? 维度 - 你的游戏是二维还是三维? 语言 -

Android研究之为基于 x86 的 Android* 游戏选择合适的引擎详解

摘要 游戏开发人员知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中,它们所占的比例超过 90%). 如要跻身该市场,开发速度非常关键. 一些刚起步的独立开发人员更愿意从零开始来开发自己的所有代码:但是为了达到更高的质量而不用花费数年的时间进行开发,其他人可能会选择已有的游戏引擎.上章研究了英特尔 Android* 开发人员指南上的对等应用详解,在选择引擎时,你可以考虑以下几个因素: 成本 - 你

3Python全栈之路系列之基于socket实现文件上传

Python全栈之路系列之基于socket实现文件上传 发布时间:2017年3月16日 00:04 浏览(106) 评论(0) 分类:Python 前言 此处没有前言 粘包 在实现发送文件功能之前我们先来理解下粘包的问题,下面有两张图,我觉得很清晰的就可以理解到了. 正常情况下发送文件 第一步: 客户端把获取到的文件总大小(size=65426)先放到缓冲区,然后发送给服务端 第二步: 此时客户端接收到的文件总大小就是65426 粘包的问题下发送文件 第一步: 客户端把获取到的文件总大小(siz

openwrt上wifi探针的实现

openwrt上wifi探针的实现 探针是通过wifi搜集经过这个AP范围的手机的mac地址,没有什么深刻的东西,知乎上关于这个东西讨论的很多,有人觉得很有用,可以做很多增值的应用,有人觉得没啥用,不过这并不妨碍我们从技术上去实现它. 看到探针,感觉很高大上的样子,其实就是通过wifi搜集经过这个AP范围的手机的mac地址,没有什么深刻的东西,知乎上关于这个东西讨论的很多,有人觉得很有用,可以做很多增值的应用,有人觉得没啥用,不过这并不妨碍我们从技术上去实现它. 802.11协议 协议里面要求每

SpringMVC经典系列-12基于SpringMVC的文件上传---【LinusZhu】

注意:此文章是个人原创,希望有转载需要的朋友们标明文章出处,如果各位朋友们觉得写的还好,就给个赞哈,你的鼓励是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系[email protected],敬请朋友们斧正,谢谢. 不知不觉已经把Spring的基础部分讲解完了,所讲述的都是在项目中经常用到的东西,是经得住考验的,接下来的部分主要是要讲述使用SpringMVC进行的文件上传.处理Ajax请求.自定义拦截器功能的实现,不多说了,首先讲解文件上传部分,开始--     

openwrt上wifi探针的实现----mt7620a+rt2860v2

openwrt上wifi探针的实现----mt7620a+rt2860v2 [摘要:甚么是wifi探针 看到探针,感到很矮小上的模样,实在便是经过wifi汇集经由那个AP局限的脚机的mac地点,出有甚么深入的器械,知乎上闭于那个器械接头的良多,有人认为很有效,能够] 什么是wifi探针 看到探针,感觉很高大上的样子,其实就是通过wifi搜集经过这个AP范围的手机的mac地址,没有什么深刻的东西,知乎上关于这个东西讨论的很多,有人觉得很有用,可以做很多增值的应用,有人觉得没啥用,不过这并不妨碍我们