ncnn网址:https://github.com/Tencent/ncnn
1、
sudo apt-get update
sudo apt-get upgrade
2、
命令:sudo apt-get install g++-4.8-arm-linux-gnueabihf
sudo apt-get install gcc-4.8-arm-linux-gnueabihf
测试:
$arm-linux-gnueabihf-g++-4.8 --version
arm-linux-gnueabihf-g++-4.8 (Ubuntu/Linaro 4.8.5-4ubuntu1) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
sudo ln -s /usr/bin/arm-linux-gnueabihf-g++-4.8 /usr/bin/arm-linux-gnueabihf-g++
sudo ln -s /usr/bin/arm-linux-gnueabihf-gcc-4.8 /usr/bin/arm-linux-gnueabihf-gcc
arm linux 64位交叉编译器
网址:https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/
下载:gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz
vi ~/.bashrc
export PATH=/home/Your Name/armlinux/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin:$PATH
source ~/.bashrc
测试:
aarch64-linux-gnu-g++ --version
输出:
aarch64-linux-gnu-g++ (Linaro GCC 6.3-2017.05) 6.3.1 20170404
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
3、在ncnn目录下的CMakeLists.txt,在cmake_minimum_required(VERSION 2.8.10)下面添加
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
add_definitions(-D__ARM_NEON)
add_definitions("-mfpu=neon")
4、 src
文件夹下,修改该文件夹下的CMakeLists.txt文件。删除如下图所示代码:
CMakeLists.txt为
############################################## configure_file(platform.h.in ${CMAKE_CURRENT_BINARY_DIR}/platform.h) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/layer) set(ncnn_SRCS allocator.cpp blob.cpp cpu.cpp layer.cpp mat.cpp mat_pixel.cpp modelbin.cpp net.cpp opencv.cpp paramdict.cpp benchmark.cpp ) macro(ncnn_add_layer class) string(TOLOWER ${class} name) # WITH_LAYER_xxx option if(${ARGC} EQUAL 2) option(WITH_LAYER_${name} "build with layer ${name}" ${ARGV1}) else() option(WITH_LAYER_${name} "build with layer ${name}" ON) endif() message("WITH_LAYER_${name} = ${WITH_LAYER_${name}}") if(WITH_LAYER_${name}) list(APPEND ncnn_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/layer/${name}.cpp") # look for arch specific implementation and append source # optimized implementation for armv7 aarch64 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/layer/arm/${name}_arm.cpp") list(APPEND ncnn_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/layer/arm/${name}_arm.cpp") set(WITH_LAYER_${name}_arm 1) endif() endif() # generate layer_declaration and layer_registry file if(WITH_LAYER_${name}) if(WITH_LAYER_${name}_arm) file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_declaration.h "extern Layer* ${class}_arm_layer_creator(); ") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h "#if NCNN_STRING {"${class}",${class}_arm_layer_creator}, #else {${class}_arm_layer_creator}, #endif ") elseif(WITH_LAYER_${name}_x86) file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_declaration.h "extern Layer* ${class}_x86_layer_creator(); ") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h "#if NCNN_STRING {"${class}",${class}_x86_layer_creator}, #else {${class}_x86_layer_creator}, #endif ") else() file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_declaration.h "extern Layer* ${class}_layer_creator(); ") file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h "#if NCNN_STRING {"${class}",${class}_layer_creator}, #else {${class}_layer_creator}, #endif ") endif() else() file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h "#if NCNN_STRING {"${class}",0}, #else {0}, #endif ") endif() # generate layer_type_enum file file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/layer_type_enum.h "${class} = ${__LAYER_TYPE_ENUM_INDEX}, ") math(EXPR __LAYER_TYPE_ENUM_INDEX "${__LAYER_TYPE_ENUM_INDEX}+1") endmacro() # create new file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/layer_declaration.h) file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/layer_registry.h) file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/layer_type_enum.h) set(__LAYER_TYPE_ENUM_INDEX 0) # layer implementation ncnn_add_layer(AbsVal) ncnn_add_layer(ArgMax OFF) ncnn_add_layer(BatchNorm) ncnn_add_layer(Bias) ncnn_add_layer(BNLL) ncnn_add_layer(Concat) ncnn_add_layer(Convolution) ncnn_add_layer(Crop) ncnn_add_layer(Deconvolution) ncnn_add_layer(Dropout) ncnn_add_layer(Eltwise) ncnn_add_layer(ELU) ncnn_add_layer(Embed) ncnn_add_layer(Exp) ncnn_add_layer(Flatten) ncnn_add_layer(InnerProduct) ncnn_add_layer(Input) ncnn_add_layer(Log) ncnn_add_layer(LRN) ncnn_add_layer(MemoryData) ncnn_add_layer(MVN) ncnn_add_layer(Pooling) ncnn_add_layer(Power) ncnn_add_layer(PReLU) ncnn_add_layer(Proposal) ncnn_add_layer(Reduction) ncnn_add_layer(ReLU) ncnn_add_layer(Reshape) ncnn_add_layer(ROIPooling) ncnn_add_layer(Scale) ncnn_add_layer(Sigmoid) ncnn_add_layer(Slice) ncnn_add_layer(Softmax) ncnn_add_layer(Split) ncnn_add_layer(SPP OFF) ncnn_add_layer(TanH) ncnn_add_layer(Threshold) ncnn_add_layer(Tile OFF) ncnn_add_layer(RNN OFF) ncnn_add_layer(LSTM OFF) ncnn_add_layer(BinaryOp) ncnn_add_layer(UnaryOp) ncnn_add_layer(ConvolutionDepthWise) ncnn_add_layer(Padding) ncnn_add_layer(Squeeze) ncnn_add_layer(ExpandDims) ncnn_add_layer(Normalize) ncnn_add_layer(Permute) ncnn_add_layer(PriorBox) ncnn_add_layer(DetectionOutput) ncnn_add_layer(Interp) ncnn_add_layer(DeconvolutionDepthWise) ncnn_add_layer(ShuffleChannel) ncnn_add_layer(InstanceNorm) ncnn_add_layer(Clip) ncnn_add_layer(Reorg) ncnn_add_layer(YoloDetectionOutput) ncnn_add_layer(Quantize) ncnn_add_layer(Dequantize) ncnn_add_layer(Yolov3DetectionOutput) add_library(ncnn STATIC ${ncnn_SRCS}) if(COVERAGE) target_compile_options(ncnn PRIVATE --coverage) endif() install(TARGETS ncnn ARCHIVE DESTINATION lib) install(FILES allocator.h blob.h cpu.h layer.h layer_type.h mat.h modelbin.h net.h opencv.h paramdict.h benchmark.h ${CMAKE_CURRENT_BINARY_DIR}/layer_type_enum.h ${CMAKE_CURRENT_BINARY_DIR}/platform.h DESTINATION include )
编译
git clone https://github.com/Tencent/ncnn cd ncnn mkdir build cd build cmake .. make -j make install
检查:
readelf libncnn.a –a
最后出现
Tag_Advanced_SIMD_arch: NEONv1 编译正确