Jak uzyskać python .pyd dla systemu Windows z kodu źródłowego c / c ++? (aktualizacja: energiczny teraz w Pythonie na wypadek, gdybyś tego chciał)
edytować: Określona biblioteka, której chciałem użyć (BRISK), została uwzględniona wOpenCV 2.4.3, więc moja potrzeba tej umiejętności zniknęła na razie. W przypadku, gdy przybyłeś tutaj szukając BRISK, tutaj jest prostyBRISK w demo Pythona że wysłałem.
MamEnergiczny kod źródłowy (Ściągnij), które chciałbym zbudować i używać w mojej aplikacji Pythona. Doszedłem do wygenerowania pliku brisk.pyd ... ale miał on 0 bajtów. Jeśli istnieje lepszy / alternatywny sposób na uzyskanie pliku brisk.pyd, to oczywiście jestem na to otwarty.
edytować: Proszę zignorować wszystkie próby w moim oryginalnym pytaniu poniżej i zobaczyć moją odpowiedź, która była możliwa dzięki szczegółowemu opisowi obmarga
Gdzie się mylę?Distutils bez ścieżki do biblioteki: Najpierw próbowałem zbudować źródło tak, jak jest to z distutils i następującym setup.py (właśnie zacząłem uczyć się distutils, więc jest to strzał w ciemności). Struktura kodu źródłowego BRISK znajduje się na dole tego pytania w celach informacyjnych.
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])
To natychmiast dało mi następujące linie i0 bajtów brisk.pyd gdzieś w folderze kompilacji. Tak blisko?
running build
running build_ext
Distutils ze ścieżką biblioteki: Podrap tę próbę. Dodałem więc dwa wiersze biblioteki, które zostały skomentowane w powyższym pliku setup.py. Wydawało się, że wszystko pójdzie dobrze, dopóki nie otrzymałem tego błędu łączenia:
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
Niekontrolowane wymachiwanie: Pomyślałem, że może trzeba było zbudować biblioteki, więc zrobiłem awaryjny kurs (wiele awarii) z cmake + mingw - mingw + vc ++ express 2010 w następujący sposób:
cmake gui: źródło: c: / brisk, build: c: / brisk / buildcmake gui: skonfigurować dla Visual Studio 10cmake gui: użyj domyślnych opcji i wygeneruj (CMAKE_BACKWARDS_COMPATIBILITY, CMAKE_INSTALL_PREFIX, EXECUTABLE_OUTPUT_PATH, LIBRARY_OUTPUT_PATH)VC ++ Express 10: Zmień na Zwolnij i zbuduj rozwiązanie wygenerowane przez cmake i uzyskaj około 20 stron, które wyglądają jak niekrytyczne ostrzeżenia, po których wszyscy odnieśli sukces. Uwaga - nie generują tego żadne biblioteki DLL. Generuje następujące biblioteki o rozmiarze podobnym do tych dołączonych do pobrania:
win32/lib/Release/
agast_static.lib
brisk_static.lib
Dalsze wymachiwanie.
Odpowiednia struktura pliku źródłowego BRISK w celach informacyjnych: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