9

我一直在尝试在 Windows 上的 Bash(Linux 的 Windows 子系统,wsl)环境中安装OpenCV ,但事实证明这非常困难。

我想我已经非常接近了,但是在输入 python 时,import cv2会出现以下错误:

ImportError: libopencv_core.so.3.1: cannot enable executable stack as shared object requires: Invalid argument

如何使库在堆栈上执行?


我的 OpenCV*opencv*.so*库文件位于/usr/local/lib/. 在普通的 Linux 环境中,我将授予这些库在堆栈上执行的能力

execstack -c /usr/local/lib/*opencv*.so*

但是,即使我可以成功下载execstack包,它也不是我可以运行以允许在堆栈上执行的可识别命令。我怀疑这与数据执行保护有关,Window 的 Exec-Shield 版本可以防止堆栈粉碎攻击。

但也许我离问题太近了,无法找出问题所在。为什么我不能导入这个 python 包?我正在使用从最新源代码(v.3.1) 编译的 Python v3.4 和 OpenCV。

4

4 回答 4

28

我解决了这个问题:tatsuya-y.hatenablog.com

我使用windows bash并安装opencvconda install -c menpo opencv3=3.1.0 然后我得到了这个(python 2.7) >>>import cv2 Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: libopencv_ccalib.so.3.1: cannot enable executable stack as shared object requires: Invalid argument

我通过execstack命令解决它

sudo apt-get install execstack
sudo execstack -c $HOME/anaconda2/lib/libopencv_*

然后sudo apt-get install gtk2.0-0 问题解决了!>>> cv2.__version__ '3.1.0'

请记住,如果按照在线安装说明,opencv 库将安装到 /usr/local/lib。因此,命令将是:

sudo execstack -c /usr/local/lib/libopencv_*
于 2016-12-20T10:03:37.803 回答
2

目前有很多事情根本不起作用,因为要么存在未实现的系统调用(WSL 仅覆盖部分,仅实现了大约 70% 的系统调用,其中一些仅部分实现),要么缺少套接字模式和选项(WSL 还不支持 Unix 数据报套接字,尽管它应该在下一个内部版本中可用)。

如果您访问 github (BashOnWindows) 并发布 strace 或搜索您的问题并找到它的副本,这是获得答案的最佳方式。从事这个项目的微软团队需要大量的反馈和错误测试。

需要明确的是,我是说你 100% 遇到了一些尚未实现的东西。但是,如果您查看 .so 文件的源代码来禁用使用该系统调用的部分代码(因为 Python 是跨平台的,并且并非所有 Linux 系统调用都支持所有 *nix 操作系统),则可能有一种方法。

于 2016-08-30T09:12:37.210 回答
1

我也遇到了同样的问题,但是我可以通过重新安装它来解决它

$ sudo apt-get install execstack

以及上面在 Windows 10 build 14393.479 中提到的评论

于 2016-12-05T21:37:33.227 回答
-1

您可以使用 execstack 安装 opencv 甚至导入 lib。然而,在 cv2.VideoCapture(0) 中进行视频捕获时,windows 的 bash 将不起作用。您需要安装完整的发行版。

于 2018-02-20T22:50:48.743 回答