一、交叉编译jpeg-9a(生成的库为libjpeg.so)
先从官网下载交叉编译器,直接解压到本地,将bin目录加入到系统变量中后,进入目录执行
./configure CC=arm-none-linux-gnueabi-gcc --enable-shared --host=arm-none-linux-gnueabi
如果不想加入到系统路径里,则增加--prefix=/home/john/jpeg_arm,即会生成新的文件夹jpeg_arm,所有库都在里面
make
make install
另外ImageMagick设置一样
二、交叉编译mysql connector(生成的库为libmysqlclient.so)
安装cmake
sudo apt-get install cmake
设置编译器
终端输入export CC=arm-linux-gcc CXX=arm-linux-g++
用cmake产生makefile
mkdir mypath
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=mypath (mypath为交叉编译之后的安装路径)
开始编译
make
make install
可能在make过程中在编译到95%的时候会报未定义到floor(),log(),pow()等数学函数,因为gcc编译时候要加-lm参数连接math.h
解决方法:
vim CMakeLists.txt 在如下两处添加-lm参数
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -lm")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -lm -fno-rtti -fno-exceptions")
如果在开始编译时include/my_global.h 中的rint()这个函数报错可以将其函数体全部注释也能编译通过
三、交叉编译ffmpeg
./configure --enable-shared --disable-yasm --enable-cross-compile --arch=arm --target-os=linux --cross-prefix=arm-none-linux-gnueabi-
补充:
mysql connector
x86 64
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=mypath
raspberry pi
export CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=mypath
都要修改:
IF(CMAKE_COMPILER_IS_GNUCXX)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -Wall -lm")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -lm -fno-rtti -fno-exceptions")
SET(CMAKE_CXX_COMPILER "${CMAKE_C_COMPILER}" CACHE INTERNAL "C++ Compiler" FORCE)
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
ImageMagick
x86 64
./configure --enable-shared --prefix=/home/john/test/ImageMagick-6.9.1-2/mypath CFLAGS="-fPIC"
raspberry pi
./configure CC=arm-linux-gnueabihf-gcc --enable-shared --prefix=/home/john/test/ImageMagick-6.9.1-2/mypath CFLAGS="-fPIC" --host=arm-linux-gnueabihf
ffmpeg
x86 64
./configure --enable-shared --disable-yasm --prefix=/home/john/test/ffmpeg-2.6.2/mypath --extra-cflags=-fPIC
raspberry pi
./configure --enable-shared --disable-yasm --enable-cross-compile --arch=arm --target-os=linux --cross-prefix=arm-linux-gnueabihf- --prefix=/home/john/test/ffmpeg-2.6.2/mypath --extra-cflags=-fPIC
jpeg-9a
x86 64
./configure --enable-shared --prefix=/home/john/test/jpeg-9a/mypath CFLAGS="-fPIC"
raspberry pi
./configure CC=arm-linux-gnueabihf-gcc --enable-shared --prefix=/home/john/test/jpeg-9a/mypath CFLAGS="-fPIC" --host=arm-linux-gnueabihf
说明:
1、因为树莓派提供的交叉编译器中不包含acl内容,所以前期考虑自己下载源码编译,但比较繁琐,acl还依赖attr,所以最后直接在树莓派中网络安装acl,然后将acl.h、libacl.so和libattr.so文件拷贝出来,放入项目中即可,注意的是,需要将acl相关的头文件和动态库路径在Makefile中指明,否则编译器会使用x86平台的头文件,产生错误;
2、另外,树莓派提供的交叉编译器读取动态库的路径也有讲究,我是采用软链接的方式将自己的库放在gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf/目录下,放在其它的lib目录下好像找不到;头文件也一样,放入gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/usr/include/下,注意的是,acl头文件默认读取<sys/acl.h>,而该目录在交叉编译器目录中不存在,所以新建gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/usr/include/sys目录即可;
3、我是使用得64位下的编译器,所有依赖的第三方库也需要按照上述方法一个个编译,经常使用ldd和file命令查看生成的文件是否正确。