Ошибка Python3.4 - невозможно включить исполняемый стек, так как для общего объекта требуется: Неверный аргумент
Я пытался установить OpenCV в среде Bash on Windows (Windows Subsystem for Linux, wsl), и это оказалось очень трудным.
Я думаю, что я очень близко, но после входа в 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 для предотвращения атак с разбиванием стека.
Но, может быть, я просто был слишком близко к проблеме, чтобы понять, что не так. Почему я не могу импортировать этот пакет Python? Я использую Python v3.4 и OpenCV, скомпилированные из новейшего исходного кода (v.3.1).
4 ответа
Я решил эту проблему следующим образом: http://tatsuya-y.hatenablog.com/entry/2016/08/29/183331
Я использую Windows Bash и установить OpenCV conda 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_*
Есть много вещей, которые просто не работают в данный момент, потому что существуют либо невыполненные системные вызовы (WSL имеет только частичное покрытие, реализовано только около 70% системных вызовов, некоторые из них только частично), либо отсутствуют режимы и параметры сокетов. (WSL еще не поддерживает сокеты датаграмм Unix, хотя он должен быть доступен в следующей сборке инсайдеров).
Если вы зайдете на github (BashOnWindows) и опубликуете страйс или выполните поиск своей проблемы и найдете ее копию, это лучший способ получить ответ. Команда Microsoft, работающая над этим проектом, хочет получить множество отзывов и тестов ошибок.
Чтобы было ясно, я говорю, что вы на 100% сталкиваетесь с тем, что еще не реализовано. Однако может быть способ, если вы посмотрите на исходный код вашего файла.so, чтобы отключить часть кода, которая использует этот системный вызов (поскольку Python является кроссплатформенным и не все системные вызовы Linux поддерживаются во всех операционных системах *nix).
У меня тоже была такая же проблема, но я смог ее исправить, просто переустановив
$ sudo apt-get install execstack
и комментарий, упомянутый выше в сборке Windows 10 14393.479
Вы можете использовать execstack для установки opencv и даже импорта lib. Но для захвата видео, как в cv2.VideoCapture(0), bash для окон не будет работать. Вам нужно установить полный дистрибутив.