Как получить исходный код расширения C/С++ в файл pyd для Windows (или другой элемент, который я могу импортировать на Python)?
edit: Конкретная библиотека, которую я хотел использовать (BRISK), была включена в OpenCV 2.4. 3, поэтому моя потребность в этом умении ушла на время. Если вы приехали сюда искать BRISK, вот простой BRISK в демонстрации Python, который я опубликовал.
У меня есть Brisk исходный код (скачать), который я хотел бы создать и использовать в моем приложении python. Я добрался до файла brisk.pyd... но это было 0 байтов. Если есть лучший/альтернативный способ нацеливания на файл brisk.pyd, то, конечно, я также открыт для этого.
изменить: Пожалуйста, проигнорируйте все попытки в моем первоначальном вопросе ниже и посмотрите мой ответ, который стал возможным благодаря подробному обходу obmarg
Где я ошибаюсь?
-
Distutils без пути библиотеки: Сначала я попытался создать источник как есть с distutils и следующий setup.py(я только начал изучать distutils, так что это выстрел в темноте). Структура исходного кода BRISK находится в нижней части этого вопроса для справки.
from distutils.core import setup, Extension module1 = Extension('brisk', include_dirs = ['include', 'C:/opencv2.4/build/include', 'C:/brisk/thirdparty/agast/include'], #libraries = ['agast_static', 'brisk_static'], #library_dirs = ['win32/lib'], sources = ['src/brisk.cpp']) setup (name = 'BriskPackage', ext_modules = [module1])
Это мгновенно предоставило мне следующие строки и 0 байт brisk.pyd где-то в папке сборки. Так близко?
running build running build_ext
-
Distutils с пути к библиотеке: Устраните эту попытку. Поэтому я добавил две библиотеки, которые закомментированы в приведенном выше setup.py. Кажется, это нормально, пока я не получил эту ошибку:
creating build\lib.win32-2.7 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:win32/lib /LIB PATH:C:\Python27_32bit\libs /LIBPATH:C:\Python27_32bit\PCbuild agast_static.lib brisk_static.lib /EXPORT:initbrisk build \temp.win32-2.7\Release\src/brisk.obj /OUT:build\lib.win32-2.7\brisk.pyd /IMPLIB:build\temp.win32-2.7\Release\src\brisk. lib /MANIFESTFILE:build\temp.win32-2.7\Release\src\brisk.pyd.manifest LINK : error LNK2001: unresolved external symbol initbrisk build\temp.win32-2.7\Release\src\brisk.lib : fatal error LNK1120: 1 unresolved externals error: command '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\link.exe"' failed with exit status 1120
-
Неконтролируемое разворот: Я подумал, что, возможно, библиотеки нужно было построить, поэтому я сделал крутой курс (много сбоев) с cmake + mingw - mingw + vС++ express 2010 следующим образом:
- cmake gui: источник: c:/brisk, build: c:/brisk/build
- cmake gui: настроить для Visual Studio 10
- cmake gui: используйте параметры по умолчанию и сгенерируйте (CMAKE_BACKWARDS_COMPATIBILITY, CMAKE_INSTALL_PREFIX, EXECUTABLE_OUTPUT_PATH, LIBRARY_OUTPUT_PATH)
-
VС++ Express 10: Измените Release и создайте решение, сгенерированное cmake, и получите около 20 страниц, которые выглядят как некритические предупреждения, за которыми следуют все. Примечание. Никакие DLL файлы не генерируются. Он генерирует следующие библиотеки такого же размера, как те, которые включены в загрузку:
win32/lib/Release/ agast_static.lib brisk_static.lib
-
Дальнейшее перемещение.
Соответствующая структура исходного файла BRISK для справки:
build/ (empty)
include/brisk/
brisk.h
hammingsse.hpp
src
brisk.cpp
demo.cpp
thirdparty/agast/
include/agast/
agast5_8.h ....
cvWrapper.h
src/
agast5_8.cc ...
CMakeLists.txt
win32/
bin/
brisk.mexw32
opencv_calib3d220.dll ...
lib/
agast_static.lib
brisk_static.lib
CMakeLists.txt
FindOpenCV.cmake
Makefile