找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4299|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

Opencv3.1.0移植/人臉識(shí)別

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:199952 發(fā)表于 2017-5-12 15:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
opencv3.1.0移植到7688
修改/home/xl/OpenCV/opencv-3.1.0/platforms/linux目錄下的
arm-gnueabi.toolchain.cmake這個(gè)文件,為了區(qū)分其它的配置文件我改名為arm-gnueabi_7688.toolchain.cmake,
修改后如下:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
為方便管理創(chuàng)建opencv_7688目錄,在它下面再創(chuàng)建兩個(gè)目錄
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
進(jìn)入7688_build_dir 目錄執(zhí)行下面這條命令
$ cmake -D CMAKE_BUILD_TYPE=Release-D CMAKE_INSTALL_PREFIX=../7688_install_dir/ -D SOFTFP=ON -D ENABLE_NEON=ON -DCMAKE_TOOLCHAIN_FILE=../../arm-gnueabi_7688.toolchain.cmake ../../../../
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
注意路徑要對(duì)應(yīng),最后面是源碼目錄
正常結(jié)束如下:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
之后在當(dāng)前目錄下多了許多文件如下:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
前面只是配置還不真正編譯,執(zhí)行make開(kāi)始編譯
移植opencv3.1.0到gk8602
修改/home/xl/OpenCV/opencv-3.1.0/platforms/linux目錄下的
arm-gnueabi.toolchain.cmake這個(gè)文件,修改如下
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
然后在當(dāng)前目錄下創(chuàng)建兩個(gè)文件夾,gk8602_build_dir,gk8602_install_dir,
進(jìn)入gk8602_build_dir目錄執(zhí)行如下一條命令
cmake -DCMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=../ gk8602_install_dir / -DSOFTFP=ON -D ENABLE_NEON=ON -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../../  
之后會(huì)在當(dāng)前目錄下生成許多文件及目錄,如下圖:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
再執(zhí)行make命令進(jìn)行編譯,make install 安裝(會(huì)自動(dòng)安裝到gk8602_install_dir目錄,這里的內(nèi)容是要放到開(kāi)發(fā)板上去的)
編寫(xiě)測(cè)試程序:
為方便管理,在linux目錄下創(chuàng)建一個(gè)gk_test目錄,如下
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg
進(jìn)入gk_test目錄編寫(xiě)cpp文件
$vim  LoadImage.cpp
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc,char* argv[]){
    string path="/home/zzz/facedata/lena.jpg";
     Mat image = imread(path, 1 );
     if(image.isContinuous()){
         cout<<"read picture successfully!"<<endl;
     }else{
         cout<<"fail to read picture!"<<endl;
     }
     return 0;
}
再編寫(xiě)CMakeLists.txt文件如下:
# this is required
set(CMAKE_SYSTEM_NAME Linux)
#注意文件對(duì)應(yīng)的路徑別弄錯(cuò)了
set(CMAKE_FIND_ROOT_PATH/opt/goke/ct_glibc/4.6.1/usr/ /opt/goke/ct_glibc/4.6.1/usr)
set(ARM_LINUX_SYSROOT/opt/goke/ct_glibc/4.6.1/usr/ CACHE PATH "ARM cross compile systemroot")
# search for programs in the buildhost directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAMNEVER)
# for libraries and headers inthe target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARYONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDEONLY)
set(TOOLCHAIN_DIR"/opt/goke/ct_glibc/4.6.1/usr/")
set(CMAKE_C_COMPILER"/opt/goke/ct_glibc/4.6.1/usr/bin/arm-goke-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER"/opt/goke/ct_glibc/4.6.1/usr/bin/arm-goke-linux-gnueabi-g++")
set(CMAKE_VERBOSE_MAKEFILE ON)
cmake_minimum_required(VERSION2.8)
project( LoadImage )
set(OpenCV_DIR/home/xl/OpenCV/opencv-3.1.0/platforms/linux/gk8602_build_dir/)
include_directories(/home/xl/OpenCV/opencv-3.1.0/platforms/linux/gk8602_install_dir/include)
#set(OpenCV_DIR /home/zzz/software/opencv-2.4.9/release)
#include_directories(/home/zzz/software/opencv-2.4.9/build/include)
find_package( OpenCV REQUIRED )
add_executable( LoadImageLoadImage.cpp )
target_link_libraries(LoadImage ${OpenCV_LIBS} )
再執(zhí)行cmake. 如下:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
執(zhí)行后如下:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg
編譯時(shí)出錯(cuò)如下:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg
于是修改CMakeCache.txt加下下面一個(gè)標(biāo)志
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg
加了上面的內(nèi)容后再make如下提示:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg
修改CMakeLists.txt如下,直接指定庫(kù)的路徑
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg
再編譯出錯(cuò):
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg
用ar –t命令查看下庫(kù)里面包含的文件,再用ar –x 把庫(kù)里的文件取出來(lái),看下是什么格式,如下:
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg
發(fā)現(xiàn)庫(kù)的是x86_64的,而我們要用在開(kāi)發(fā)板上應(yīng)該是這種格式才行
file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg
移植opencv3.1.0到hi3516a
參考文章:
一、交叉編譯opencv3.1.0
1、修改cmake文件
在源碼的platforms下已經(jīng)有對(duì)各平臺(tái)的交叉編譯支持,我們只需要做一些簡(jiǎn)單的修改。
[zzz@localhostplatforms]$ pwd
/home/zzz/software/opencv-3.1.0/platforms
[zzz@localhostplatforms]$ ll
total 28
drwxr-xr-x. 4 zzz zzz 4096 Dec 18 23:02 android
drwxr-xr-x. 3 zzz zzz 4096 Dec 18 23:02 ios
drwxr-xr-x. 4 zzz zzz 4096 Jan 22 17:24 linux
drwxr-xr-x. 2 zzz zzz 4096 Dec 18 23:02 osx
-rw-r--r--. 1 zzz zzz  323 Dec 18 23:02 readme.txt
drwxr-xr-x. 2 zzz zzz 4096 Dec 18 23:02 scripts
drwxr-xr-x. 2 zzz zzz 4096 Dec 18 23:02 winrt
我們的目標(biāo)是交叉編譯到arm上,那么就進(jìn)入到linux下:
[zzz@localhost linux]$ pwd
/home/zzz/software/opencv-3.1.0/platforms/linux
[zzz@localhost linux]$ ll
total 20
-rw-r--r--.  1 zzz zzz 4196 Jan22 16:35arm-gnueabi.toolchain.cmake
...
arm-gnueabi.toolchain.cmake指明了交叉編譯的一些路徑等設(shè)置,我們根據(jù)實(shí)際情況對(duì)其進(jìn)行適當(dāng)修改:
set(CMAKE_SYSTEM_NAMELinux)
set(CMAKE_SYSTEM_VERSION1)
set(CMAKE_SYSTEM_PROCESSORarm-hisiv300-linux-gnueabi)
set(GCC_COMPILER_VERSION"4.6" CACHE STRING "GCCCompiler version")
set(FLOAT_ABI_SUFFIX"")
if (NOT SOFTFP)
    set(FLOAT_ABI_SUFFIX"hf")
endif()
#CROSS COMPILESETTING
set(TOOLCHAIN_DIR"/opt/hisi-linux/x86-arm/arm-hisiv300-linux/")
set(CMAKE_C_COMPILER"/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-gcc")
set(CMAKE_CXX_COMPILER"/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-g++")
set(CMAKE_FIND_ROOT_PATH/opt/hisi-linux/ /opt/hisi-linux/x86-arm/arm-hisiv300-linux/)
set(ARM_LINUX_SYSROOT/opt/hisi-linux/x86-arm/arm-hisiv300-linux/ CACHE PATH "ARM cross compile system root")
MESSAGE(STATUS "Thisis cross compile dir --->"$(CMAKE_C_COMPILER))
#find_program(CMAKE_C_COMPILER NAMESarm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc-${GCC_COMPILER_VERSION})
#find_program(CMAKE_CXX_COMPILER NAMESarm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++-${GCC_COMPILER_VERSION})
#set(ARM_LINUX_SYSROOT /usr/arm-linux-gnueabi${FLOAT_ABI_SUFFIX}CACHE PATH "ARM cross compilation systemroot")
#set(CMAKE_CXX_FLAGS          ""                    CACHESTRING "c++ flags")
#set(CMAKE_C_FLAGS            ""                    CACHESTRING "c flags")
#set(CMAKE_SHARED_LINKER_FLAGS ""                    CACHE STRING "shared linker flags")
#set(CMAKE_MODULE_LINKER_FLAGS ""                    CACHE STRING "module linker flags")
#set(CMAKE_EXE_LINKER_FLAGS   "-Wl,-z,nocopyreloc"  CACHE STRING "executable linker flags")
set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -mthumb-fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}-mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
set(CMAKE_SHARED_LINKER_FLAGS"-Wl,--fix-cortex-a8-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now${CMAKE_SHARED_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS"-Wl,--fix-cortex-a8-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now${CMAKE_MODULE_LINKER_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS    "-Wl,--fix-cortex-a8-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now${CMAKE_EXE_LINKER_FLAGS}")
if(USE_NEON)
  message(WARNING "You use obsolete variable USE_NEON to enable NEONinstruction set. Use -DENABLE_NEON=ON instead." )
  set(ENABLE_NEONTRUE)
elseif(USE_VFPV3)
  message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3instruction set. Use -DENABLE_VFPV3=ON instead." )
  set(ENABLE_VFPV3TRUE)
endif()
#set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH}${ARM_LINUX_SYSROOT})
if(EXISTS${CUDA_TOOLKIT_ROOT_DIR})
    set(CMAKE_FIND_ROOT_PATH${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR})
endif()
set(CMAKE_SKIP_RPATH TRUE CACHE BOOL "Ifset, runtime paths are not added when using shared libraries." )
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDEONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARYONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAMONLY)
# macro to find programs on the host OS
macro( find_host_program )
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
if( CMAKE_HOST_WIN32 )
  SET( WIN32 1 )
  SET( UNIX )
elseif(CMAKE_HOST_APPLE )
  SET( APPLE 1 )
  SET( UNIX )
endif()
find_program( ${ARGN})
SET( WIN32 )
SET( APPLE )
SET( UNIX 1 )
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
endmacro()
# macro to find packages on the host OS
macro( find_host_package )
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
if( CMAKE_HOST_WIN32 )
  SET( WIN32 1 )
  SET( UNIX )
elseif(CMAKE_HOST_APPLE )
  SET( APPLE 1 )
  SET( UNIX )
endif()
find_package( ${ARGN})
SET( WIN32 )
SET( APPLE )
SET( UNIX 1 )
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
endmacro()
2、交叉編譯
設(shè)置好了以后,開(kāi)始進(jìn)行交叉編譯:
建立好執(zhí)行cmake的路徑:build_softfp,建立好編譯后的安裝路徑:install_dir
[zzz@localhost linux]$ ll
total 20
-rw-r--r--.  1 zzz zzz4196 Jan 22 16:35 arm-gnueabi.toolchain.cmake
drwxrwxr-x. 15 zzz zzz4096 Jan 22 16:38 build_softfp
drwxrwxr-x.  6 zzz zzz4096 Jan 22 15:51 install_dir
執(zhí)行:
[zzz@localhost build_softfp]$ pwd
/home/zzz/software/opencv-3.1.0/platforms/linux/build_softfp
[zzz@localhost build_softfp]$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install_dir/ -D SOFTFP=ON -DENABLE_NEON=ON -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../../
等待10幾分鐘。
之后還要執(zhí)行make ,makeinstall,完成,再執(zhí)行下面的測(cè)試
二、編寫(xiě)測(cè)試程序
1、程序內(nèi)容
簡(jiǎn)單測(cè)試對(duì)圖片的加載:
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc,char*argv[]){
   string path="/home/zzz/facedata/lena.jpg";
    Mat image = imread( path, 1 );
    if(image.isContinuous()){
         cout<<"read picture successfully!"<<endl;
    }else{
         cout<<"fail to read picture!"<<endl;
    }
    return 0;
}
2、編譯
CMakeLists.txt:
# this is required
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_FIND_ROOT_PATH /opt/hisi-linux/ /opt/hisi-linux/x86-arm/arm-hisiv300-linux/)
set(ARM_LINUX_SYSROOT/opt/hisi-linux/x86-arm/arm-hisiv300-linux/ CACHE PATH "ARM cross compile system root")
# search for programs in the build host directories (notnecessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(TOOLCHAIN_DIR "/opt/hisi-linux/x86-arm/arm-hisiv300-linux/")
set(CMAKE_C_COMPILER "/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-gcc")
set(CMAKE_CXX_COMPILER "/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-g++")
set(CMAKE_VERBOSE_MAKEFILE ON)
cmake_minimum_required(VERSION 2.8)
project( LoadImage )
set(OpenCV_DIR /home/zzz/software/opencv-3.1.0/platforms/linux/build_softfp/)
include_directories(/home/zzz/software/opencv-3.1.0/platforms/linux/install_dir/include)
#set(OpenCV_DIR /home/zzz/software/opencv-2.4.9/release)
#include_directories(/home/zzz/software/opencv-2.4.9/build/include)
find_package( OpenCV REQUIRED )
add_executable( LoadImage LoadImage.cpp )
target_link_libraries( LoadImage ${OpenCV_LIBS} )
可以把上半部分的內(nèi)容抽取出來(lái),作為交叉編譯的指示文件:
# this is required
set(CMAKE_SYSTEM_NAMELinux)
set(CMAKE_FIND_ROOT_PATH/opt/hisi-linux/ /opt/hisi-linux/x86-arm/arm-hisiv300-linux/)
set(ARM_LINUX_SYSROOT/opt/hisi-linux/x86-arm/arm-hisiv300-linux/ CACHE PATH "ARM cross compile system root")
# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAMNEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARYONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDEONLY)
set(TOOLCHAIN_DIR"/opt/hisi-linux/x86-arm/arm-hisiv300-linux/")
set(CMAKE_C_COMPILER"/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-gcc")
set(CMAKE_CXX_COMPILER"/opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-g++")
set(CMAKE_VERBOSE_MAKEFILEON)
執(zhí)行如下:
[zzz@localhost basictest]$ cmake .
-- The C compiler identification is GNU 4.8.3
-- The CXX compiler identification is GNU 4.8.3
-- Check for working C compiler: /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-gcc
-- Check for working C compiler: /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-gcc-- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-g++
-- Check for working CXX compiler: /opt/hisi-linux/x86-arm/arm-hisiv300-linux/bin/arm-hisiv300-linux-uclibcgnueabi-g++-- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to:/home/zzz/workspace/arm-opencv3.1.0/src/basictest
[zzz@localhost basictest]$ make
Scanning dependencies of targetLoadImage
[100%] Building CXX objectCMakeFiles/LoadImage.dir/LoadImage.cpp.o
Linking CXX executable LoadImage
[100%] Built target LoadImage
[zzz@localhost basictest]$
三、在板上運(yùn)行
需要設(shè)置好LD_LIBRARY_PATH,使其也指向一開(kāi)始生成的opencv的庫(kù)文件路徑,或者直接將這些庫(kù)拷貝到LD_LIBRARY_PATH指定的當(dāng)前路徑中。
四、問(wèn)題
一開(kāi)始沒(méi)有設(shè)定好cmake的交叉編譯設(shè)置,導(dǎo)致在編譯測(cè)試程序的時(shí)候,使用的是系統(tǒng)的c++編譯器在編譯鏈接,結(jié)果提示無(wú)法讀取opencv的so的符號(hào)等。所以對(duì)cmake的設(shè)置要在實(shí)踐中慢慢掌握全面一些。
后記(2016-1-28):
由于使用的板子有浮點(diǎn)運(yùn)算單元以及neon,但是上面的編譯腳本沒(méi)有使用相關(guān)的參數(shù),包括編譯opencv的庫(kù)以及編譯自己的執(zhí)行程序時(shí)都沒(méi)有用上。因此,編譯出來(lái)的程序沒(méi)有用上硬件浮點(diǎn)單元的特性。需要進(jìn)行修改:
1、修改opencv的交叉編譯腳本
主要是設(shè)置:
27
28 set(CMAKE_CXX_FLAGS           "-mthumb -mcpu=cortex-a7 -mfloat-abi=softfp-mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressi    ve-loop-optimizations"    CACHE STRING "c++ flags")
29 set(CMAKE_C_FLAGS             "${CMAKE_CXX_FLAGS}"                    CACHE STRING "c flags")
30 set(CMAKE_SHARED_LINKER_FLAGS"${CMAKE_CXX_FLAGS}"                    CACHE STRING "shared linkerflags")
31 set(CMAKE_MODULE_LINKER_FLAGS"${CMAKE_CXX_FLAGS}"                    CACHE STRING "module linkerflags")
32 set(CMAKE_EXE_LINKER_FLAGS    "${CMAKE_CXX_FLAGS}-Wl,-z,nocopyreloc"  CACHE STRING "executable linker flags")
33
34 #set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -mthumb -fdata-sections-Wa,--noexecstack -fsigned-char -Wno-psabi")
35 #set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}-mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
36
37 #set(CMAKE_SHARED_LINKER_FLAGS"-Wl,--fix-cortex-a8-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-    z,now ${CMAKE_SHARED_LINKER_FLAGS}")
38 #set(CMAKE_MODULE_LINKER_FLAGS"-Wl,--fix-cortex-a8-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-    z,now ${CMAKE_MODULE_LINKER_FLAGS}")
39 #set(CMAKE_EXE_LINKER_FLAGS    "-Wl,--fix-cortex-a8-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-    z,now ${CMAKE_EXE_LINKER_FLAGS}")
40
我這里只需要生成so,是否只需要設(shè)置CMAKE_SHARED_LINKER_FLAGS這個(gè)就可以了?
2、編譯出來(lái)的so的情況:
[zzz@localhost build_softfp]$ cmake-D CMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install_dir/ -D SOFTFP=ON-DENABLE_NEON=ON -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../../
[zzz@localhost build_softfp]$ readelf-a lib/libopencv_imgproc.so.2.4.9
...
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "Cortex-A7"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv4
Tag_Advanced_SIMD_arch: NEONv1 with Fused-MAC
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_CPU_unaligned_access: v6
Tag_MPextension_use: Allowed
Tag_DIV_use: Allowed in v7-A with integer division extension
Tag_Virtualization_use: TrustZone andVirtualization Extensions
[zzz@localhost build_softfp]$
·         

我加了一個(gè)-DENABLE_NEON=ON,不加也可以。
3、修改執(zhí)行程序的腳本
在toolchainfile里增加:
set(CMAKE_CXX_FLAGS          "-mthumb -mcpu=cortex-a7-mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access-fno-aggressive-loop-optimizations"    CACHE STRING "c++ flags")
set(CMAKE_C_FLAGS            "${CMAKE_CXX_FLAGS}"                    CACHE STRING "c flags")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_FLAGS}"                    CACHE STRING "shared linkerflags")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_CXX_FLAGS}"                    CACHE STRING "module linkerflags")
set(CMAKE_EXE_LINKER_FLAGS   "${CMAKE_CXX_FLAGS}-Wl,-z,nocopyreloc"  CACHE STRING "executable linker flags")
經(jīng)過(guò)測(cè)試,其實(shí)不設(shè)置CMAEK_CXX_FLAGS,CMAKE_C_FLAGS及其他,只設(shè)置CMAKE_EXE_LINKER_FLAGS,都能達(dá)到目標(biāo)。
產(chǎn)生的exe的情況:
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "Cortex-A7"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv4
Tag_Advanced_SIMD_arch: NEONv1 with Fused-MAC
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_CPU_unaligned_access: v6
Tag_MPextension_use: Allowed
Tag_DIV_use: Allowed in v7-A with integer division extension
Tag_Virtualization_use: TrustZone andVirtualization Extensions

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表