cd glog-0.3.5
./configure --host=arm-linux --prefix=/usr/local/HI3516D/v400/glog-0.3.5 CFLAGS="-ffunction-sections -fdata-sections -O2" CXXFLAGS="-ffunction-sections -fdata-sections -O2"
make -j8
make install
使用cmake-gui进行配置
#
修改CMakeLists.txt
# 强制打开NEON开关
# OCV_OPTION(ENABLE_NEON "Enable NEON instructions" "${NEON}" IF CMAKE_COMPILER_IS_GNUCXX AND (ARM OR AARCH64 OR IOS) )
OCV_OPTION(ENABLE_NEON "Enable NEON instructions" ON )
修改OpenCVCompilerOptions.cmake
# 将ENABLE_NEON开启之后的gcc参数修改为海思3516D推荐的参数"-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp"
if(ENABLE_NEON)
add_extra_compiler_option("-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp")
使用cmake-gui进行配置
选择Specify options for cross-compiling,进入交叉编译链设置界面
# 设置交叉编译相关参数
# 本文使用的是海思3516D SDK 提供的 V400 工具链,存放位置为/opt/arm-hisiv400-linux/(更改为你正在使用的目录)
# 设置Operating System 为 arm-linux
# 设置C编译器为 /opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-gcc
# 设置C++编译器为 /opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-g++
# 设置System Root 为 /opt/arm-hisiv400-linux/target
点击Configure生成配置选项,并且打开Advancd选项
修改设置选项:
# 去掉勾选为FLASE 勾选为TRUE
BUILD_SHARED_LIBS # FLASE为编译静态库 TRUE为编译动态库
CMAKE_BUILD_TYPE # Release
CMAKE_CXX_FLAGS # -fPIC
CMAKE_C_FLAGS # -fPIC
CMAKE_EXE_LINKER_FLAGS # -lrt -lpthread
CMAKE_INSTALL_PREFIX # 自定义安装目录
WITH_CUDA # FLASE 禁用CUDA
WITH_CUFFT # FLASE 禁用CUFFT
WITH_FFMPEG # FLASE 禁用FFMPEG
WITH_OPENCL # FLASE 禁用OPENCL
WITH_OPENCLAMDBLAS # FLASE 禁用OPENCLAMDBLAS
WITH_OPENCLAMDFFT # FLASE 禁用OPENCLAMDFFT
WITH_OPENCL_SVM # FLASE 禁用OPENCL_SVM
点击Generate生成Makefile
进入_install目录&编译
cd _install
make -j8
make install
生成PC版本protoc可执行文件,供编译ARM版本库时使用
# 修改/etc/bash.bashrc 设置为CC/CXX/LD为普通gcc编译器
cd protobuf-3.2.0
./autoconf.sh
./configure --prefix=/usr/local/PC/protobuf-3.2.0
编译ARM版本
# 修改/etc/bash.bashrc 设置为CC/CXX/LD为交叉编译器
cd protobuf-3.2.0
./autoconf.sh
./configure --build=i686-pc-linux --host=arm-linux --with-protoc=/usr/local/PC/protobuf-3.2.0/bin/protoc --prefix=/usr/local/HI3516D/v400/protobuf-3.2.0
修改Makefile.arm
# 根据你的ARM处理器版本和操作系统修改对应的CCOMMON_OPT和FCOMMON_OPT
# 本文档针对的是HI3516D,属于armv7架构
ifeq ($(CORE), $(filter $(CORE),ARMV7 CORTEXA9 CORTEXA15))
ifeq ($(OSNAME), Android)
CCOMMON_OPT += -mfpu=neon -march=armv7-a
FCOMMON_OPT += -mfpu=neon -march=armv7-a
else
# CCOMMON_OPT += -mfpu=neon -march=armv7-a
# FCOMMON_OPT += -mfpu=neon -march=armv7-a
CCOMMON_OPT += -ffunction-sections -fdata-sections -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp
FCOMMON_OPT += -ffunction-sections -fdata-sections -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp
endif
endif
编译
cd OpenBLAS-0.2.20
# 编译单独的静态库版本
make TARGET=ARMV7 HOSTCC=gcc CROSS=1 CROSS_SUFFIX=arm-hisiv400-linux-gnueabi- BINARY=32 NOFORTRAN=1 libs -j8
# 编译动态库版本
make TARGET=ARMV7 HOSTCC=gcc CROSS=1 CROSS_SUFFIX=arm-hisiv400-linux-gnueabi- BINARY=32 NOFORTRAN=1 libs shared -j8
安装
# PREFIX使用您自己的自定义安装目录
make PREFIX=/usr/local/HI3516D/v400/openBLAS-0.2.20 install
因为在交叉编译HDF5的过程中需要实时运行H5detect和H5make_libsettings这两个可执行文件来生成H5Tinit.c和H5lib_settings.c,但是因为交叉编译生成的H5detect和H5make_libsettings只能在Arm上面运行
将首次交叉编译生成的H5detect和H5make_libsettings拷贝到Arm目标系统上执行,执行成功后可以生成H5Tinit.c和H5lib_settings.c,将这两个Arm上面生成的文件替换到交叉编译的源码中
因为这里采用了手动拷贝执行文件到Arm目标上执行的方法,所以再次交叉编译的时候屏蔽掉相关生成步骤
修改configure文件
# 屏蔽掉所有和交叉编译验证相关的步骤
# 搜索cannot run test program while cross compiling获得具体校验代码位置(共四处)
if test "$cross_compiling" = yes; then :
# { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
# $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
# as_fn_error $? "cannot run test program while cross compiling
# See \`config.log' for more details" "$LINENO" 5; }
else
# 执行配置
./configure --host=arm-linux --prefix=/usr/local/HI3516D/v400/hdf5-1.8.20 CFLAGS="-ffunction-sections -fdata-sections -O2" CXXFLAGS="-ffunction-sections -fdata-sections -O2"
修改Makefile
# 屏蔽掉和H5Tinit.c、H5lib_settings.c生成相关的Makefile代码
H5Tinit.c: H5detect$(EXEEXT)
# LD_LIBRARY_PATH="$$LD_LIBRARY_PATH`echo $(LDFLAGS) | \
sed -e 's/-L/:/g' -e 's/ //g'`" \
$(RUNSERIAL) ./H5detect$(EXEEXT) > $@ || \
(test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
($(RM) $@ ; exit 1)
H5lib_settings.c: H5make_libsettings$(EXEEXT) libhdf5.settings
# LD_LIBRARY_PATH="$$LD_LIBRARY_PATH`echo $(LDFLAGS) | \
sed -e 's/-L/:/g' -e 's/ //g'`" \
$(RUNSERIAL) ./H5make_libsettings$(EXEEXT) > $@ || \
(test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
($(RM) $@ ; exit 1)
编译&安装
make
make install
生成编译脚本
cd boost_1_59_0
./bootstrap.sh --prefix=/usr/local/HI3516D/v400/boost-1.59.0
修改编译脚本project-config.jam
if ! gcc in [ feature.values <toolset> ]
{
using gcc : arm : arm-hisiv400-linux-gnueabi-gcc ; # 注意中间的多处空格
}
编译&生成
./bjam install toolset=gcc-arm --layout=togged --build-type=complete --prefix=/usr/local/HI3516D/v400/boost-1.59.0
修改Makefile.arm
# 根据你的ARM处理器版本和操作系统修改对应的CCOMMON_OPT和FCOMMON_OPT
# 本文档针对的是HI3516D,属于armv7架构
ifeq ($(CORE), $(filter $(CORE),ARMV7 CORTEXA9 CORTEXA15))
ifeq ($(OSNAME), Android)
CCOMMON_OPT += -mfpu=neon -march=armv7-a
FCOMMON_OPT += -mfpu=neon -march=armv7-a
else
# CCOMMON_OPT += -mfpu=neon -march=armv7-a
# FCOMMON_OPT += -mfpu=neon -march=armv7-a
CCOMMON_OPT += -ffunction-sections -fdata-sections -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp
FCOMMON_OPT += -ffunction-sections -fdata-sections -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp
endif
endif
编译
cd OpenBLAS-0.2.20
# 编译单独的静态库版本
make TARGET=ARMV7 HOSTCC=gcc CROSS=1 CROSS_SUFFIX=arm-hisiv400-linux-gnueabi- BINARY=32 NOFORTRAN=1 libs -j8
# 编译动态库版本
make TARGET=ARMV7 HOSTCC=gcc CROSS=1 CROSS_SUFFIX=arm-hisiv400-linux-gnueabi- BINARY=32 NOFORTRAN=1 libs shared -j8
安装
// PREFIX使用您自己的自定义安装目录
make PREFIX=/usr/local/HI3516D/v400/openBLAS-0.2.20 install
修改Makefile和Makefile.config
#
编译&生成
#
make all
#
make all -j8
make install