我在mac上使用这些命令安装了opencv:
$ wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.3/OpenCV-2.4.3.tar.bz2
$ tar xjvf OpenCV-2.4.3.tar.bz2
$ cd OpenCV-2.4.3
$ mkdir build; cd build
$ cmake -G "Unix Makefiles" -D CMAKE_OSX_ARCHITECTURES=i386 -D CMAKE_C_FLAGS=-m32 -D CMAKE_CXX_FLAGS=-m32 ..
$ make -j4
$ sudo make install
然后我尝试通过导入它来使用它,但得到以下错误:
~/opencv-2.4.4/build $ python
Python 2.7.3 (default, Mar 28 2013, 14:31:14)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/cv.py", line 3, in <module>
from cv2.cv import *
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/cv2.so, 2): no suitable image found. Did find:
/usr/local/lib/python2.7/site-packages/cv2.so: mach-o, but wrong architecture
更新
在编译OpenCV时,我注意到它从以前的版本中获取了python库(由apple安装了一个):
-- Could NOT find PythonLibs: Found unsuitable version "2.7.2", but required is exact version "2.7.3" (found /usr/lib/libpython2.7.dylib)
-- Python:
-- Interpreter: /usr/local/bin/python2 (ver 2.7.3)
-- Libraries: /usr/lib/libpython2.7.dylib (ver 2.7.2)
-- numpy: /usr/local/lib/python2.7/site-packages/numpy/core/include (ver 1.7.0)
-- packages path: lib/python2.7/site-packages
我该如何解决这个问题?
答案 0 :(得分:1)
错误告诉您问题是“mach-o,但架构错误”。这通常意味着您尝试在64位应用程序中加载32位库,反之亦然(或类似地,对于英特尔与PowerPC)。
无论你安装了哪种Python,你都可能拥有一个可以作为32位应用程序或64位应用程序运行的通用构建,但默认情况下它运行为64位。但是你明确地为32位构建OpenCV:
$ cmake -G "Unix Makefiles" -D CMAKE_OSX_ARCHITECTURES=i386 -D CMAKE_C_FLAGS=-m32 -D CMAKE_CXX_FLAGS=-m32 ..
如果这是一个错误,只需重建,不要那样做。
如果你想要它是32位,你可以在32位模式下启动Universal python,或者安装一个32位的Python。
与此同时,你正试图用Homebrew安装的Python 2.7.3来运行它,但你很有可能在Apple预安装的2.7.2上构建它(或者更糟糕的是,部分构建它方式,另一方面)。
首先,人们将Homebrew添加到PATH的常用方式不会影响使用sudo
运行的任何命令,因此如果sudo make install
做任何事情来找到你的Python,它可能会发现不同于cmake
和make
做了。
其次,Apple的Python和Homebrew认为他们拥有/usr/local/lib/python2.7
(并且还认为他们拥有安装/usr/local/bin/pip-2.7
等工具/脚本的专有权,这使得这更加痛苦。
答案 1 :(得分:0)
根据我的经验,(来自debian的arm-linux-gcc(uclibc)交叉编译),
Python试图用dlopen(/usr/lib/python2.7/site-packages/cv2.so)加载正确的文件,但是我得到了#34;找不到文件&#34;而文件存在。
在我的董事会上:
$ python
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: File not found
实际上,动态负载试图加载递归依赖库(当然)。但是,就我而言,libstdc ++没有嵌入我的主板,而opencv需要它:
主持人:
$ arm-linux-readelf -d ./lib/cv2.so
Dynamic section at offset 0x24197c contains 23 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libpython2.7.so.1.0]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.0]*
我希望它可以提供帮助。