交叉编译OpenCV的应用 [英] Cross compilation openCV application

查看:199
本文介绍了交叉编译OpenCV的应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我在做C ++的ARM的应用程序。我有我与交叉编译,编译一个应用原型,并在ARM的作品非常好。我所做的是这样的:

首先,我得到了.o文件将这样的

  ARM-Linux的G ++ -c PrototipoTRU.cpp

然后,我得到这样的(我的应用程序中使用线程)中的.exe

  ARM-Linux的G ++ PrototipoTRU.o -o tru2 -pthread

和一切都运行完美。

我的问题是,当我试图编译它使用了OpenCV的cpp文件。我试过:

首先,我想拿到的.o:

  ARM-Linux的G ++ -c camera.cpp

这是不行的,我得到了这样的输出:

  IPCamera.cpp:5:30:错误:opencv2 / opencv.hpp:没有这样的文件或目录
IPCamera.cpp:6:39:错误:opencv2 / highgui / highgui.hpp:没有这样的文件或目录
IPCamera.cpp:7:39:错误:opencv2 / imgproc / imgproc.hpp:没有这样的文件或目录
IPCamera.cpp:11:22:错误:X11 / Xlib.h:没有这样的文件或目录
IPCamera.cpp:16:错误:'简历'不是一个命名空间名
IPCamera.cpp:16:错误:之前的预期空间名';'象征
IPCamera.cpp:在函数'主INT(INT,CHAR **):
IPCamera.cpp:46:错误:'简历'尚未声明
IPCamera.cpp:46:错误:预期';'前上限
IPCamera.cpp:52:错误:显示在此范围未声明
IPCamera.cpp:52:错误:DISP在此范围中未声明
IPCamera.cpp:52:错误:'XOpenDisplay在此范围未声明
IPCamera.cpp:53:错误:'屏'在此范围未声明
IPCamera.cpp:53:错误:SCRN在此范围未声明
IPCamera.cpp:53:错误:'DefaultScreenOfDisplay在此范围未声明
IPCamera.cpp:63:错误:'简历'尚未声明
IPCamera.cpp:63:错误:预期';'前框架
IPCamera.cpp:66:错误:'简历'尚未声明
IPCamera.cpp:66:错误:'CV_WINDOW_NORMAL在此范围未声明
IPCamera.cpp:68:错误:'cvMoveWindow在此范围未声明
IPCamera.cpp:73:错误:'CV_WND_PROP_FULLSCREEN在此范围未声明
IPCamera.cpp:73:错误:'CV_WINDOW_FULLSCREEN在此范围未声明
IPCamera.cpp:73:错误:'cvSetWindowProperty在此范围未声明
IPCamera.cpp:79:错误:'帽子'在此范围未声明
IPCamera.cpp:82:错误:框架在此范围未声明
IPCamera.cpp:89:错误:'简历'尚未声明
IPCamera.cpp:92:错误:'简历'尚未声明

因此​​,它似乎有一些问题的联系,但是如果做到这一点:

  G ++ -c IPCamera.cpp

我得到了.o文件将,但很明显,当我得到的。exe它不会在ARM工作。我不就是已了解为什么,如果我编译应用程序没有OpenCV的,就像第一个例子,臂的linux-g ++的工作propertly,当我尝试编译OpenCV的应用程序没有。

我也试过编译器是这样的:

  ARM-Linux的G ++ -c IPCamera.cpp`pkg配置OpenCV的--libs --cflags`

不过是同样的结果,但如果我这样做:

  G ++ -c IPCamera.cpp`pkg配置OpenCV的--libs --cflags`

它的工作原理。所以我想这是一个路径问题,但我不知道我怎样才能解决它。

有人能帮助我吗?

感谢你们

喜dennisfen这是MI文件的内容:

 集(CMAKE_SYSTEM_NAME的Linux)
 集(CMAKE_SYSTEM_VERSION 1)
 集(CMAKE_SYSTEM_PROCESSOR ARM) 集(GCC_COMPILER_VERSION4.6CACHE STRINGGCC编译器版本) 集(FLOAT_ABI_SUFFIX) 如果(不SOFTFP)
   集(FLOAT_ABI_SUFFIX高频)
 万一() 集(CMAKE_C_COMPILER臂Linux的
 gnueabi $ {} FLOAT_ABI_SUFFIX -gcc - $ {} GCC_COMPILER_VERSION)
 集(CMAKE_CXX_COMPILER臂Linux的
 gnueabi $ {} FLOAT_ABI_SUFFIX ++ -g - $ {} GCC_COMPILER_VERSION)
 集(ARM_LINUX_SYSROOT的/ usr / ARM-Linux的gnueabi $ {} FLOAT_ABI_SUFFIX缓存路径ARM交叉
 编译系统根) 集(CMAKE_CXX_FLAGS,CACHE STRINGC ++标志)
 集(CMAKE_C_FLAGS,CACHE STRINGC标志)
 集(CMAKE_SHARED_LINKER_FLAGS,CACHE STRING共享链接标志)
 集(CMAKE_MODULE_LINKER_FLAGS,CACHE STRING模块连接器选项)
 集(CMAKE_EXE_LINKER_FLAGS-Wl,-z,nocopyrelocCACHE STRING的可执行文件链接
 标志) 集(CMAKE_CXX_FLAGS$ {} CMAKE_CXX_FLAGS -mthumb -fdata截面-Wa, - noexecstack
 -fsigned-CHAR -Wno-psabi)
 集(CMAKE_C_FLAGS$ {} CMAKE_C_FLAGS -mthumb -fdata截面-Wa, - noexecstack
 -fsigned-CHAR -Wno-psabi) 集(CMAKE_SHARED_LINKER_FLAGS轮候册, - 修复 - Cortex-A8的轮候册, - 没有不确定轮候册, - GC-
 部分-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,现在$ {CMAKE_SHARED_LINKER_FLAGS})
 集(CMAKE_MODULE_LINKER_FLAGS轮候册, - 修复 - Cortex-A8的轮候册, - 没有不确定轮候册, - GC-
 部分-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,现在$ {CMAKE_MODULE_LINKER_FLAGS})
 集(CMAKE_EXE_LINKER_FLAGS轮候册, - 修复 - Cortex-A8的轮候册, - 没有不确定轮候册, - GC-
 部分-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,现在$ {CMAKE_EXE_LINKER_FLAGS})


解决方案

看来你需要设置包括路径的交叉OpenCV的安装:

  ARM-Linux的G ++ -I /路径/要/ OpenCV的/包括IPCamera.cpp -o tru2

你主机系​​统不适合你的手臂交叉工具链当你调用pkg配置它报告的设置。

Hi guys I am doing an application in c++ for ARM. I have a application prototype which I compiled with cross compilation and it works very nice in the ARM. What I did was this:

First I got the .o file like this

arm-linux-g++ -c PrototipoTRU.cpp    

Then I got the .exe like this (My application use thread)

arm-linux-g++ PrototipoTRU.o -o tru2 -pthread

and everything works perfect.

My problem is when I tried to compile an .cpp file which use OpenCV. I tried that:

First I tried to got the .o:

 arm-linux-g++ -c camera.cpp

That does not work, I got this output:

IPCamera.cpp:5:30: error: opencv2/opencv.hpp: No such file or directory
IPCamera.cpp:6:39: error: opencv2/highgui/highgui.hpp: No such file or directory
IPCamera.cpp:7:39: error: opencv2/imgproc/imgproc.hpp: No such file or directory
IPCamera.cpp:11:22: error: X11/Xlib.h: No such file or directory
IPCamera.cpp:16: error: 'cv' is not a namespace-name
IPCamera.cpp:16: error: expected namespace-name before ';' token
IPCamera.cpp: In function 'int main(int, char**)':
IPCamera.cpp:46: error: 'cv' has not been declared
IPCamera.cpp:46: error: expected ';' before 'cap'
IPCamera.cpp:52: error: 'Display' was not declared in this scope
IPCamera.cpp:52: error: 'disp' was not declared in this scope
IPCamera.cpp:52: error: 'XOpenDisplay' was not declared in this scope
IPCamera.cpp:53: error: 'Screen' was not declared in this scope
IPCamera.cpp:53: error: 'scrn' was not declared in this scope
IPCamera.cpp:53: error: 'DefaultScreenOfDisplay' was not declared in this scope
IPCamera.cpp:63: error: 'cv' has not been declared
IPCamera.cpp:63: error: expected ';' before 'frame'
IPCamera.cpp:66: error: 'cv' has not been declared
IPCamera.cpp:66: error: 'CV_WINDOW_NORMAL' was not declared in this scope
IPCamera.cpp:68: error: 'cvMoveWindow' was not declared in this scope
IPCamera.cpp:73: error: 'CV_WND_PROP_FULLSCREEN' was not declared in this scope
IPCamera.cpp:73: error: 'CV_WINDOW_FULLSCREEN' was not declared in this scope
IPCamera.cpp:73: error: 'cvSetWindowProperty' was not declared in this scope
IPCamera.cpp:79: error: 'cap' was not declared in this scope
IPCamera.cpp:82: error: 'frame' was not declared in this scope
IPCamera.cpp:89: error: 'cv' has not been declared
IPCamera.cpp:92: error: 'cv' has not been declared

So it seem that there is some problem with the link, however if do this:

 g++ -c IPCamera.cpp

I got the .o file, but obviously when I get the .exe it does not work in the ARM . What I do not undestand is why if I compile an application without opencv, like the first example, the arm-linux-g++ works propertly and when I try to compile the openCV application no.

I tried to compiler also like this:

 arm-linux-g++ -c IPCamera.cpp `pkg-config opencv --libs --cflags`

but is the same result, however if I do this:

 g++ -c IPCamera.cpp `pkg-config opencv --libs --cflags`

It works. So I guess that is a path problem but I do not have idea how I can solved it.

Someone can help me??

Thank you guys

Hi dennisfen this is the content of mi file:

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

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

 set(FLOAT_ABI_SUFFIX "")

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

 set(CMAKE_C_COMPILER    arm-linux- 
 gnueabi${FLOAT_ABI_SUFFIX}-gcc-${GCC_COMPILER_VERSION})
 set(CMAKE_CXX_COMPILER  arm-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 system root")

 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} -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}")

解决方案

It seems that you need to set include path to your cross OpenCV installation:

arm-linux-g++ -I/path/to/opencv/include IPCamera.cpp -o tru2

When you call pkg-config it reports settings for you host system not for your arm cross toolchain.

这篇关于交叉编译OpenCV的应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆