openwrt下交叉编译-lmysqlclient
一、正常编译mysql源码(非必须)
首先,在虚拟机里,正常配置(cmake ./ --xxx)、编译(make)、安装(make install)myslq。
1.为什么先要正常编译mysql?
(1)熟悉过程,整体的感受一下从配置到编译再到安装成功的过程,我们很多Linux软件源码安装都是类似的;
(2)在后面的交叉编译过程中有可能会用到正常编译生成的一些文件(我这里没有用到,正常编译可以使用gcc或者gcc-4.8.3,推荐后者)。
2.注意:
(1)下载mysql源码时注意下载稳定版本(6.0.2),否则会在cmake时就报一些奇怪的错误,在文章最后有图文说明和解决方法总结。
(2)正常配置编译时不要设置交叉编译工具的环境变量,否则可能造成“环境污染”,即在正常编译时会链接交叉编译环境的库和头文件,造成编译错误。
3.编译安装步骤:
(1)新建文件夹
mkdir myconnect
(2)拷贝mysql压缩包到文件夹下
cp mysql-connector-c-6.0.2.tar.gz ./myconnect
(3)解压缩
tar xvzf mysql-connector-c-6.0.2.tar.gz
(4)进入文件夹下
cd mysql-connector-c-6.0.2
(5)新建安装目录
mkdir connector
(6)Cmake并指定安装目录:(可以cmake -help了解一下相关命令)
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=connector
注意:如果你Ubuntu安装了mysql,这里一定要指定安装目录,否则之后安装会在ubuntu的默认软件安装目录再次安装6.0.2的mysql。
只要版本正确,这里基本不会出什么问题。
(7)编译
make
这里只要没有“环境污染”,一般是不会出什么问题的。
(8)安装
make install
一般编译成功后,安装不会出什么问题。
二、配置交叉编译环境变量(非必须)
一般来说,开发板的说明书会教你编译及安装交叉工具链及环境变量配置,且每个人的配置都可能不同,所以这里不再细说,如果你的交叉编译工具链安装配置已经做了就不需要再进行这一步了。
1.配置环境变量
sudo vim /etc/bash.bashrc
输入密码后在文本末添加相关内容,我贴上我的内容仅供参考:
一个是交叉编译链的bin路径,一个是openwrt下的staging_dir。
2.使环境变量生效
source /etc/bash.bashrc(记得给虚拟机保存快照,因为环境变量配置出错容易破坏系统,届时shell都无法正常使用,很可能需要直接重装系统,所以这一步之前慎重一些)
。。。
运行后题头变白,不再显示彩色。
提醒一点,配置环境变量就是为了让交叉编译器可用以及链接时可以链接到交叉编译所需的头文件及库等。
三、交叉编译(第一次出错很正常,耐心点,不要着急,如果没出错?恭喜你,可以去买彩票了)
1.可以选择建文件夹解压到文件夹下也可以直接解压,我这里直接解压
tar xvzf mysql-connector-c-6.0.2.tar.gz
提醒一点:使用命令解压,不要选择提取压缩文件的方式,这样有可能造成安装位置错误,操作严格按照步骤来。
2.进入文件夹下
cd mysql-connector-c-6.0.2/
3.修改CMakeLists.txt文件
建议:了解一下cmake和CMakeLists.txt,对交叉编译mysql会有很大的帮助。
在带有project那句话之前添加:
SET(CMAKE_CXX_COMPILER "mipsel-openwrt-linux-g++")
SET(CMAKE_C_COMPILER "mipsel-openwrt-linux-gcc")
之后保存退出。
4.创建myconnector
mkdir connector
5.Cmake
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=connector
注意一点:一定要指定安装目录,不然会安装到默认路径。
这样就算是cmake完成了:
我估计修改下哪里后面make就不会报错了(有时候你感觉不合理,那么很可能就是不合理的),但是没有找到好的解决方法,只好选择性忽略了,选择手动解决编译错误。(已经找到解决方法,不用再辛苦的手动在每个txt文件中添加-lpthread了,查看追加部分)
6.编译make(这一步很容易出错,在文章后面我把遇到的所有错误都进行了总结)
解决完错误后再make:
建议:使用make V=s编译,便于找出错误。
7.安装
make install
这样就算是安装成功了。
同样,编译错误解决后,安装一般不存在问题,但是如果你没有设置好安装目录,那么可能会出现如下错误:
那么检查安装目录是否指定正确,是否严格按照上述步骤进行的。
当然,如果你要安装mysql源码到Ubuntu的话,加上sudo即可(make也需要)。
8.安装后的myconnector目录结构
我们需要的就是lib和include文件夹下的内容。
当我们需要调用mysql的头文件和库文件时最好也调用这里的头文件和库文件,生成ipk包时也需要这里的头文件和库文件。
四、交叉编译错误及解决方法总结
1.版本问题
版本问题主要是编译器版本问题和mysql源码版本问题,我主要遇到的问题是mysql源码版本问题,这里主要说明。编译器版本问题在我最开始给的参考网站里提到了,遇到的参考着去解决 。说到这,我提醒大家,一定要把我在文章开头提到的参考网址里的内容好好看一下,基本上我就是参考里面的内容然后结合我实际情况来解决的所有问题。切记:结合自身实际,不可照本宣科。
Mysql源码版本问题:
(1)首先,去mysql官网下载源码
根据你的实际情况下载相应版本,我这里展示我下的版本位置及注意事项:
百度:
(2)点击进入:(选择你需要的,我这里交叉编译-lmysqlclient)
(3)点击进入:
根据你的系统等选择左侧内容,右上角注意要选择稳定版本,不要选择最新版本,看不懂英文的百度一下,不要着急选择。如果不是稳定版本的话解压后进行cmake就会报一些奇怪的错误,比如:
CMake Error at configure.cmake:573 (MESSAGE):
No mysys timer support detected!
Call Stack (most recent call first):
CMakeLists.txt:452 (INCLUDE)
(4)最后点击download:
选择最下面的进行下载即可。
下载完成后,复制到虚拟机中进行上面的操作即可(现在一般都是用虚拟机吧,用真机有时候真的不太方便,嗯?偏题了!)。虚拟机VMware tools没有安装且不会的同学可以看我的另一个总结:“VMware使用总结”。
2.编译错误
Cmake后进行make出现如下类似错误的,请看参考网址解决方法,我在正常编译时遇到过,按照上面的方法成功解决。
“my_global.h:1582:22: error: static declaration of 'rint' follows non-static declaration”
还有一种就是到95%后出现的问题,我这里出现的问题和参考网址上出现的问题类似,但是还是有很多不同之处,借助于上面提到的解决问题的方式方法,最终成功解决。
错误如下:
意思比较明确,找不到相关pthread函数的定义,那么非常有可能就是缺少-lpthread,按照参考文章里说的用make VERBOSE=1(至于该条命令的意思有兴趣的可以百度一下),
然后根据命令详情去解决就可以了,如果是参考文章上的那种形式,直接按照上面的解决方法去解决就可以了。我这里说一下我这里的解决方式。
首先,利用make VERBOSE=1后(也即make V=s),我的结果是类似这样的:
cd /home/ubantu/mysql-connector-c-6.0.2/unittest/libmysql && /usr/bin/cmake -E cmake_link_scriptCMakeFiles/ps.dir/link.txt--verbose=1
/opt/OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc -Wall -fno-rtti -fno-exceptions -O3 -DNDEBUG -DDBUG_OFF CMakeFiles/ps.dir/ps.c.o -o ps -rdynamic ../mytap/libmytap.a ../../libmysql/libmysqlclient.a /opt/OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/lib/libm.so -Wl,-rpath,/opt/OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/lib
../../libmysql/libmysqlclient.a(my_thr_init.c.o): In function `my_thread_destroy_mutex':
my_thr_init.c:(.text+0x338): undefined reference to `pthread_getspecific'
../../libmysql/libmysqlclient.a(my_thr_init.c.o): In function `my_thread_init':
仔细看可以发现,相关的编译命令是在CMakeFiles/ps.dir/link.txt中的,所以要加-lpthread必须要去该文件下加,但是没有这个文件的路径,怎么办?参考文章中说了,find命令(Linux基本操作),ok,在mysql源码根目录下,find ./ -name “link.txt”(因为我知道不止一个link.txt要改,所以我直接搜出所有的方便后面修改)。
用vim打开(用你熟悉的编辑器),然后在文章末尾加上-lpthread,然后make,发现还有错误,但是错误少了,这说明确实是缺少-lpthread这个问题,但是不止这一个文件缺少,继续make VERBOSE=1,结合错误和你找到的路径,解决所有错误,我大概改了二十个左右的link.txt文件make就完成了。(所以,直接使用make V=s)
这里,我说一点,参考文章上面是改环境变量一步到位的,但是由于我这里是link.txt,里面没有相关的参数,所以改了环境变量也没用,只好手动一个一个改了,我觉得这里一定有一个好的方法可以一步到位的(感觉真灵),但是能力有限,也没找出来,有大神或者找到的同学可以分享一下,有交流进步才快嘛。
展示一个txt里面的内容:
/opt/OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-mipsel_24kec+dsp_gc c-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc -Wall -fno-rtti -fno-exceptions -O3 -DNDEBUG -D DBUG_OFF CMakeFiles/mysql_config.dir/mysql_config.c.o -o mysql_config -rdynamic ../libmysql/libmysqlclien t.a /opt/OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-mipsel_24kec+ds p_gcc-4.8-linaro_uClibc-0.9.33.2/lib/libm.so -Wl,-rpath,/opt/OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_ uClibc-0.9.33.2.Linux-i686/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/lib:-lpthread
在最后加上-lpthread,make后就可以看到问题解决了,然后一个一个解决就OK了,make和make install也可以成功的完成了。(大神看到这里可能就笑了,事实上,当我熟悉这里之后也发现自己之前的可笑,这里的txt都是cmake自动生成的,所以根源不在这里,在CMakeLists.txt,但是这也能见证我的成长,有目标,总会进步的,关于CMakeLists.txt我在追加部分进行了叙述。)
五、追加
完美解决make时缺少相应库的问题。
当学习了一阵子后慢慢认识了cmake这个工具,我们的mysql源码正是通过cmake来编译的,而cmake的核心就是CmakeLists.txt文件,通过这个文件,我们执行cmake时就会自动生成Makefile脚本,进而我们执行make时就会运行Makefile脚本进行编译,那么make时缺少库的问题就很好解决了,在CMakeLists.txt文件中添加上相关的库就可以了,于是,我首先加上了-lpthread,如下:
在上述位置增加了SET(CMAKE_EXE_LINKER_FLAGS "-lpthread")
再make,果然进行到97%了,没有了之前的缺少pthread库的问题:
但是又发现缺少dl库,好吧,再加上-ldl:
编译完成了,我的CMakeLists.txt只增加了这一点,就完成了之前一大堆的任务,果然,了解本质才能走的更快,走的更远:
在我去交叉工具链的bin目录下查看时,我发现除了mipsel-openwrt-linux-gcc还有mipsel-openwrt-linux-gcc-4.8.3:(这主要是gcc有两个版本)
我使用它直接编译了一个mysql相关程序时,生成可执行程序时竟然不需要加上-lpthread,这让我惊喜万分,于是我再一次更改了CmakeLists.txt,直接更改了交叉编译器,不再使用增加链接库的方式:
再cmake后make,直接编译成功了:(看来gcc-4.8.3对于mysql的编译支持的更好)
六、最后
基础的东西永远是根本,掌握根本,才能走的更远走的更快;学会找到问题本质并从本质去解决问题。