2015-06-03 170 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