Python3.4错误-不能启用可执行堆栈作为共享对象要求:无效参数



我一直在尝试在Windows (Windows Subsystem for Linux, 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包,但它不是一个可以运行以允许在堆栈上执行的可识别命令。我怀疑这与Data Execution Prevention有关,Window版本的Exec-Shield可以防止stack smashing攻击。

但也许我只是太接近问题,不知道哪里出了问题。为什么我不能导入这个python包?我使用Python v3.4和OpenCV编译从最新的源代码(v.3.1)。

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

我使用windows bash并通过conda install -c menpo opencv3=3.1.0安装opencv然后我得到了这个(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_*

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

如果你去github (BashOnWindows)并发布一个strace或搜索你的问题并找到它的副本,这是获得答案的最佳方式。这个项目的微软团队希望得到大量的反馈和bug测试。

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

我也有同样的问题,但我能够通过重新安装它来修复它

$ sudo apt-get install execstack

和上面提到的Windows 10 build 14393.479

的注释

您可以使用execstack来安装opencv甚至导入lib。然而,对于视频捕获,如在cv2. videoccapture(0)中,bash for windows将无法工作。你需要安装一个完整的发行版

最新更新