¿Cómo obtener un .pyd para Windows de python desde el código fuente de c / c ++? (Actualización: enérgico ahora en Python en caso de que eso sea lo que quieres)

¿Cómo pasar del código fuente de la extensión C / C ++ a un archivo pyd para Windows (u otro elemento que pueda importar a Python)?

editar: La biblioteca específica que quería usar (BRISK) se incluyó enOpenCV 2.4.3 por lo que mi necesidad de esta habilidad desapareció por el momento. En caso de que vinieras aquí buscando BRISK, aquí hay un simpleBRISK en la demostración de Python que he publicado.

TengoEnérgico código fuente (descargar) que me gustaría compilar y usar en mi aplicación de Python. Llegué a generar un archivo brisk.pyd ... pero tenía 0 bytes. Si hay una forma mejor / alternativa de apuntar a un archivo brisk.pyd, entonces, por supuesto, también estoy abierto a eso.

editar: Ignore todos los intentos en mi pregunta original a continuación y vea mi respuesta que fue posible gracias al detallado tutorial de obmarg.

¿A dónde me voy mal?

Distutils sin camino de biblioteca: Primero traté de construir la fuente tal como está con distutils y el siguiente setup.py (Acabo de comenzar a aprender distutils, así que esto es un tiro en la oscuridad). La estructura del código fuente de BRISK se encuentra en la parte inferior de esta pregunta como referencia.

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])

Eso me dio al instante las siguientes líneas y un0 bytes brisk.pyd En algún lugar de la carpeta de compilación. ¿Tan cerca?

running build
running build_ext

Distutils con la ruta de la biblioteca: Rasca ese intento. Así que agregué las dos líneas de la biblioteca que están comentadas en el setup.py anterior. Eso pareció ir bien hasta que obtuve este error de enlace:

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

Flagelación incontrolada: Pensé que tal vez debían construirse las bibliotecas, así que hice un curso intensivo (muchos bloqueos) con cmake + mingw - mingw + vc ++ express 2010 de la siguiente manera:

cmake gui: fuente: c: / brisk, compilación: c: / brisk / buildcmake gui: configurar para Visual Studio 10cmake gui: use las opciones predeterminadas y genere (CMAKE_BACKWARDS_COMPATIBILITY, CMAKE_INSTALL_PREFIX, EXECUTABLE_OUTPUT_PATH, LIBRARY_OUTPUT_PATH)

VC ++ Express 10: Cambie a Liberar y cree la solución generada por cmake y obtenga aproximadamente 20 páginas de lo que parecen advertencias no críticas seguidas por todas las que tuvieron éxito. Nota: no se generan dlls por esto. Genera las siguientes bibliotecas de tamaño similar a las que se incluyen con la descarga:

win32/lib/Release/
    agast_static.lib
    brisk_static.lib

Más flaqueos.

Estructura relevante del archivo fuente BRISK para referencia:
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

Respuestas a la pregunta(2)

Su respuesta a la pregunta