- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何从C/C++扩展源代码获取Windows的pyd文件(或其他我可以导入到Python的项目)?
编辑:我想要使用的特定库(BRISK)包含在OpenCV 2.4.3中,因此我暂时对这种技能的需求消失了。如果您是来这里寻找危险的,这是我发布的一个简单的BRISK in Python demo。
我有想要在python应用程序中构建和使用的Brisk源代码(download)。我可以生成一个brisk.pyd文件...但是它是0字节。如果有一种针对brisk.pyd文件的更好/替代的方法,那么我当然也愿意这样做。
编辑:请忽略下面我原始问题中的所有尝试,并查看我的答案是由obmarg的详细演练提供的
我要去哪里错了?
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])
running build
running build_ext
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
win32/lib/Release/
agast_static.lib
brisk_static.lib
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
最佳答案
您确定这个轻快的库甚至可以导出python绑定(bind)吗?我在源代码中看不到任何引用-它甚至似乎都没有导入python头文件。这肯定可以解释为什么到目前为止您没有取得太大的成功-您不能只编译纯C++代码并期望python与之交互。
我认为您的第二个distutils示例最接近正确-它显然是在编译内容并进入链接器阶段,但是随后遇到此错误。该错误只是意味着它找不到名为initbrisk的函数,我猜这将是模块的顶级init函数。同样,这表明您正在尝试从不适合它的代码中编译python模块。
如果您想自己将C++代码包装在python包装器中,则可以看看the official documentation on writing c/c++ extensions。另外,您可以看看boost::python,SIP或shiboken,它们尝试某种程度(或完全)自动化从C++代码制作python扩展的过程。
编辑:既然您似乎已经为自己解决问题做出了相当大的努力,并发布了一个很好的问题,我决定就如何执行此操作给出更详细的答复。
使用boost::python包装C++库的快速教程
就我个人而言,我只使用过boost::python这样的东西,所以我将尝试为您做一个很好的总结。我将假定您使用的是Visual C++2010。我还将假定您安装了32位版本的python,因为我相信boost pro库仅提供32位二进制文件。
安装升压
首先,您需要获取boost库的副本。最简单的方法是从the boost pro website下载安装程序。这些应该安装在Windows上使用boost c++库所需的所有头文件和二进制文件。请注意将这些文件安装到的位置,因为稍后将需要它们-最好将其安装到路径中没有空格的位置。为简单起见,我假设您将这些文件放在C:\boost中,但是您可以将其替换为实际使用的路径。
另外,您可以按照these instructions从源代码构建增强功能。我不确定100%,但是可能是为了获得与您安装的python版本兼容的boost::python版本,您需要这样做。
设置视觉工作室项目
接下来,您将要为brisk.pyd设置一个Visual Studio项目。如果打开Visual Studio,请转到“新建”->“项目”,然后找到Win32 Project的选项。设置您的位置等,然后单击“确定”。在出现的向导中,选择一个DLL项目类型,然后选中空项目复选框。
现在,您已经创建了项目,您需要设置include&library路径,以允许您使用python,boost::python和brisk.lib文件。
在Visual Studios解决方案资源管理器中,右键单击您的项目,然后从出现的菜单中选择属性。这将打开您的项目的属性页。转到链接器->常规部分,然后查找其他库目录部分。您需要使用.lib
文件的路径填充boost,python和brisk_static.lib
的路径。通常,这些可以在的lib
(或libs
)子目录中找到
无论您将库安装在哪里。路径用分号分隔。我在下面附上了我的设置的屏幕截图:
接下来,您需要使Visual Studio链接到.lib文件。这些部分可以在属性的“链接器”->“输入”部分的“附加依赖项”字段中找到。同样,这是一个用分号分隔的列表。您应该需要为python添加库(在我的情况下为python27.lib
,但这会因版本而异)和brisk_static.lib
。这些不需要完整路径,就像您在上一阶段中添加的那样。同样,这是一个屏幕截图:
您可能还需要添加boost_python库文件,但是我认为boost使用一些头文件魔术可以为您节省麻烦。如果我不正确,那么请查看一下提升类似于boost_python-vc100-mt.lib
的文件的库路径并将其添加。
最后,您需要设置包含路径,以允许您的项目包含相关的C++头文件。要使相关设置显示在项目属性中,您需要向项目中添加.cpp文件。右键单击您的解决方案资源管理器中的源文件文件夹,然后去添加新项。选择一个C++文件(.cpp),并将其命名为main.cpp(或其他所需名称)。
接下来,返回您的项目属性,然后转到C/C++-> General。在附加库目录下,您需要添加轻快,python和boost的包含路径。再次,为分隔符使用分号,并再次提供屏幕截图:
我怀疑您可能需要更新这些设置以同时包含opencv2和agast库,但我将把它留给您自己解决,因为它应该是相同的过程。
用boost::python包装现有的c++类。
现在有点棘手了-实际编写C++将您的轻快库包装在boost python中。您可以找到有关here的教程,但我也将尝试对其进行详细介绍。
这将在您之前创建的main.cpp
文件中进行。首先,在文件顶部添加所需的相关include语句:
#include <brisk/brisk.h>
#include <Python.h>
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(brisk)
{
}
brisk
的python模块。
BOOST_PYTHON_MODULE(brisk)
{
using namespace boost::python;
class_< cv::BriskPatternPoint >( "BriskPatternPoint" )
.def_readwrite("x", &cv::BriskPatternPoint::x)
.def_readwrite("y", &cv::BriskPatternPoint::y)
.def_readwrite("sigma", &cv::BriskPatternPoint::sigma);
class< cv::BriskScaleSpace >( "BriskScaleSpace", init< uint8_t >() )
.def( "constructPyramid", &cv::BriskScaleSpace::constructPyramid );
}
class_< cv::BriskPatternPoint >( "BriskPatternPoint" )
告诉boost::python使用
cv::BriskPatternPoint
C++类声明一个类,并在python中将其公开为
BriskPatternPoint
。
.def_readwrite("y", &cv::BriskPatternPoint::y)
向
BriskPatternPoint
类添加了一个可读和可写的属性。该属性名为y,它将映射到
BriskPatternPoint::y
c++字段。
class< cv::BriskScaleSpace >( "BriskScaleSpace", init< uint8_t >() )
声明了另一个类,这次是
BriskScaleSpace
,但它还提供了一个接受uint8_t的构造函数(一个无符号字节-应该只映射为python中的整数,但是我要小心不要传入大于255个字节的整数-我不不知道在那种情况下会发生什么)
.def
行仅声明了一个函数-boost::python(我认为)应该能够自动确定函数的参数类型,因此您无需提供它们。
site-packages
),将其导入并使用即可!
import brisk
patternPoint = brisk.BriskPatternPoint()
....
关于c++ - 如何从c/c++源代码获取Windows的python .pyd? (更新: brisk now in Python in case that's what you want),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10664658/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!