概述:
本文以dwncs项目为示例,简述x86_64 ubuntu16虚拟机中交叉编译Mips64el目标机的可执行文件。本文主要叙述系统环境、交叉编译器搭建、项目依赖库编译、项目编译、缺陷等五个部分(文档用于个人记录,某些细节说明不到位)。
一、系统环境
1、开发环境
2、目标环境
注:此处需注意目标机属性Byte Order,此处为Little Endian(小端模式)
二、区分:mips、mipsel、mips64、mips64el
mips:32位大端字节序
mipsel:32位小端字节序
mipsel:是64位大端字节序
mips64el:是64位小端字节序
三、交叉编译环境
1、选择交叉编译器
Architecture:mips64 -> x64
Byte Order:Little Endian -> el(小端模式)
故:选择mips64el版本gcc编译器
2、查看mips64el-linux-gcc交叉编译器
Shell:apt search mips64el-linux
3、安装交叉编译器
Shell:sudo apt install g++-mips64el-linux-gnuabi64
Shell:sudo apt install gcc-mips64el-linux-gnuabi64
4、测试交叉编译环境
四、依赖库交叉编译
注:dwncs依赖类库
libffi:https://github.com/libffi/libffi
libwebsockets:https://github.com/warmcat/libwebsockets
libjson-c:https://github.com/json-c/json-c
oepnssl:https://github.com/openssl/openssl
libzlog:https://github.com/HardySimpson/zlog
1、json-c
(1)解压json-c-master.zip(偷懒双击拖出)
(2)修改CMakeLists.txt文件
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER "mips64el-linux-gnuabi64-gcc")
SET(CMAKE_CXX_COMPILER "mips64el-linux-gnuabi64-g++")
复制
(3)mkdir build && cd build
(4)执行cmake
cmake .. -DCMAKE_INSTALL_PREFIX=/home/hcy/Public/dev/cross-complie/mips64el/json-c
复制
(5)make && make install
(6)安装目录
2、libffi
(1)解压libffi-3.3.tar.gz文件
(2)mkdir build && cd build(重复过程不做截图)
(3)执行configure
../configure CC=mips64el-linux-gnuabi64-gcc --enable-shared --prefix=/home/hcy/Public/dev/cross-complie/mips64el/ffi --host=mips64el-linux-gnuabi64
复制
(4)make && make install
(5)安装目录
3、openssl(version 1.0.2;websockets依赖环境,优先安装)
(1)解压openssl-OpenSSL_1_0_2-stable.zip文件
(2)执行config
./config no-asm -shared --prefix=/home/hcy/Public/dev/cross-complie/mips64el/openssl
复制
(3)修改Makefile文件(修改编译器;删除-m64)
(4)make && make install(openssl编译安装很慢)
(5)安装目录
4、websockets
(1)解压libwebsockets-main.zip文件
(2)修改CMakeLists.txt文件
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_C_COMPILER "mips64el-linux-gnuabi64-gcc")
SET(CMAKE_CXX_COMPILER "mips64el-linux-gnuabi64-g++")
复制
(3)mkdir build && cd build
(4)执行cmake(设置openssl头文件及类库目录)
cmake .. -DCMAKE_INSTALL_PREFIX=/home/hcy/Public/dev/cross-complie/mips64el/websockets \
-DLWS_OPENSSL_INCLUDE_DIRS=/home/hcy/Public/dev/cross-complie/mips64el/openssl/include \
-DLWS_OPENSSL_LIBRARIES="/home/hcy/Public/dev/cross-complie/mips64el/openssl/lib/libcrypto.so;/home/hcy/Public/dev/cross-complie/mips64el/openssl/lib/libssl.so;"
复制
(5)make && make install
(6)安装目录
5、zlog(编译失败,后续补全)
五、项目编译
1、Makefile构建(指定链接库位置)
2、注释zlog日志相关代码
3、清空编译文件
4、编译更新程序
5、编译主程序
6、查看可执行文件
7、拷贝至目标机测试(其他文件是项目依赖文件)
(1)执行环境
(2)upgrade
(3)dwncs主程序
六、美中不足
1、开发机交叉编译环境待整理,目标机版本过多容易混乱
2、项目Makefile脚本文件待优化
3、zlog类库编译n次依旧未能成功,没有日志的程序排错异常艰难