2015-06-03 168 views
1

我正在嘗試創建一個嵌入軸相機的應用程序,它具有MIPS處理器。我正在用我的項目使用opencv。現在,在運行create-package.sh mipsisa32r2el之後,我收到了錯誤,它跳過了不兼容的庫並且找不到庫。我想我應該爲MIPS處理器交叉編譯opencv,但我不知道我該怎麼做。我已經檢查過opencv文檔,但是我沒有找到針對MIPS處理器的交叉編譯。爲mips處理器交叉編譯opencv

+0

你使用mips工具鏈(gcc等)來編譯它嗎?另外,缺少的庫需要存在。 –

+0

在create-package.sh中,它使用mipsisa32r2el-axis-linux-gnu-gcc編譯項目。它錯過了opencv的所有庫。 –

+0

噢好吧,我想你正在建造一個Axis相機,這將是一個懶惰的過程:) –

回答

1

從您的意見,它看起來像你的編譯腳本已經在使用GCC交叉編譯爲MIPS(mipsisa32r2el-axis-linux-gnu-gcc看起來像是來自安訊士攝像機工具鏈),如果你沒有這樣的GCC(也許腳本指的是它,但你沒有它),你需要建立一個類似BuildrootCrosstool-NG的mips32el工具鏈,它不是太難(並且缺少的庫可能已經可以在工具鏈構建腳本中選擇)。

您主要是這裏有兩個問題,涉及到的事實,你不具備所有必需的依賴/庫:

  1. 有些庫是不兼容:工具鏈的GCC找不到所需的庫和它試圖使用一個存在於主機操作系統

  2. 有些庫是完全缺少:工具鏈的GCC找不到該庫的任何地方

爲了解決這些問題,每次編譯腳本沒有找到庫時,編譯它,然後將生成的.so放在LD_LIBRARY_PATH的其中一個目錄中。爲每個缺失/不兼容的庫執行此操作。 這將是一個漫長的過程。

+1

非常感謝,它絕對幫助 –

1

我發現了一個更簡單的方法,通過改變臂gnueabi.toolchain.cmak使用MIPS編譯 這裏編譯MIPS處理器OpenCV的代碼被更改的cmake的:

set(CMAKE_SYSTEM_NAME Linux) 
set(CMAKE_SYSTEM_VERSION 1) 
set(CMAKE_SYSTEM_PROCESSOR mips) 

set(GCC_COMPILER_VERSION "4.6" CACHE STRING "GCC Compiler version") 

set(FLOAT_ABI_SUFFIX "") 
if (NOT SOFTFP) 
    set(FLOAT_ABI_SUFFIX "hf") 
endif() 

#find_program(CMAKE_C_COMPILER NAMES mipsisa32r2el-axis-linux-  gnu${FLOAT_ABI_SUFFIX}-gcc${GCC_COMPILER_VERSION}) 
#find_program(CMAKE_CXX_COMPILER NAMES mipsisa32r2el-axis-linux- gnu${FLOAT_ABI_SUFFIX}-g++${GCC_COMPILER_VERSION}) 
set(CMAKE_C_COMPILER /usr/local/mipsisa32r2el/r12/bin/mipsisa32r2el-axis- linux-gnu-gcc) 
set(CMAKE_CXX_COMPILER /usr/local/mipsisa32r2el/r12/bin/mipsisa32r2el-axis-linux-gnu-g++) 
set(CMAKE_CXX_FLAGS   ""     CACHE STRING "c++ flags") 
set(CMAKE_C_FLAGS    ""     CACHE STRING "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} -fdata-sections -Wa,--noexecstack - fsigned-char ") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char ") 

set(CMAKE_SHARED_LINKER_FLAGS "-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,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now ${CMAKE_MODULE_LINKER_FLAGS}") 
set(CMAKE_EXE_LINKER_FLAGS "-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 NEON instruction set. Use -DENABLE_NEON=ON instead.") 
    set(ENABLE_NEON TRUE) 
elseif(USE_VFPV3) 
    message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead.") 
    set(ENABLE_VFPV3 TRUE) 
endif() 

set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${MIPS_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 "If set, runtime paths are not added when using shared libraries.") 
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) 

# 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() 

通過這個全光照的cmake我做靜態庫opencv