如何从 C/C++ 扩展源代码到 Windows 的 pyd 文件(或我可以导入到 Python 的其他项目)?
编辑:我想使用的特定库(BRISK)包含在OpenCV 2.4.3 中,所以我对这项技能的需求暂时消失了。如果您来这里寻找 BRISK,这里是我发布的 Python 演示中的简单 BRISK 。
我有想要在我的 python 应用程序中构建和使用的Brisk源代码(下载)。我已经生成了一个 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 + vc++ express 2010 做了一个速成课程(很多崩溃),如下所示:
- cmake gui:来源:c:/brisk,构建:c:/brisk/build
- cmake gui:为 Visual Studio 10 配置
- cmake gui:使用默认选项并生成(CMAKE_BACKWARDS_COMPATIBILITY、CMAKE_INSTALL_PREFIX、EXECUTABLE_OUTPUT_PATH、LIBRARY_OUTPUT_PATH)
VC++ Express 10:更改为发布并构建由 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