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
|