- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我几乎可以肯定我在一年前做过一次……不是说它行不通。诡异的。我一定是在某个地方犯了一个小错误......请帮忙!
我有以下玩具 C 代码:
// testdll.c
int sum(int a, int b)
{
return(a+b);
}
然后,由于我使用的是 Windows 7,因此我使用 WinSDK 7.1 的 x64 C/C++ 编译器对其进行编译:
cl testdll.c /TC /LD
输出是testdll.dll。
然后,在我的 Python 3.3 中,我使用了:
In [12]: import ctypes
In [13]: lib = ctypes.cdll.LoadLibrary('./testdll.dll')
In [14]: lib
Out[14]: <CDLL './testdll.dll', handle f7000000 at a43ea58>
In [15]: lib.sum
Traceback (most recent call last):
File "<ipython-input-15-309017dbbec8>", line 1, in <module>
lib.sum
File "C:\WinPython2\python-2.7.6.amd64\lib\ctypes\__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "C:\WinPython2\python-2.7.6.amd64\lib\ctypes\__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'sum' not found
找不到这个函数!这让我疯狂。由于我使用的是纯 C,并且在编译过程中使用了/TC,所以这不应该是名称修改问题。
任何想法将不胜感激。非常感谢大家!
编辑 2014/02/13我也尝试用 gcc 编译它,但没有成功。同样的老问题发生了。我在 python 中使用了 dir(),并意识到所有内容都应该在其中——只是名称不正确,我的意思是它不能通过 fun.sum 调用。能够识别函数的结果类型是int。
In [34]: dir(lib)
Out[34]:
['_FuncPtr',
'__class__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__getattr__',
'__getattribute__',
'__getitem__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'_func_flags_',
'_func_restype_',
'_handle',
'_name']
In [35]: lib._func_restype_
Out[35]: ctypes.c_long
最佳答案
导出符号的一种方法是通过链接器的选项:
cl testdll.c /LD /link /export:sum
这无法扩展。更好的选择是在声明中使用 __declspec(dllexport)
修饰符。引用Exporting from a DLL在 Visual Studio 文档中。
按如下方式有条件地应用它:
#ifdef BUILD_TESTDLL
#define TESTAPI __declspec(dllexport)
#else
#define TESTAPI __declspec(dllimport)
#endif
/* declaration */
TESTAPI int sum(int a, int b);
/* definition */
int sum(int a, int b)
{
return(a+b);
}
通过导入库链接时,声明应使用 __declspec(dllimport)
,这是 TESTAPI
的默认设置。构建 DLL 时,在项目设置中或通过 /D
在命令行上定义 BUILD_TESTDLL
。
最后,为了获得最大的灵 active ,请使用如下所示的 .def 文件:
LIBRARY TESTDLL
EXPORTS
sum @ 10 NONAME
sum_alias=sum @ 20
这使您可以使用不同的名称导出函数,或仅按序号导出。将其添加为源文件,如下所示:
cl testdll.c testdll.def /LD
然后在 Python 中,例如:
>>> from ctypes import *
>>> lib = cdll.testdll
>>> lib.sum_alias(1, 2)
3
>>> lib[10](1, 2)
3
>>> lib[20](1, 2)
3
顺便说一句,ctypes 不会预加载 DLL 的导出。 dir(lib)
一开始不会显示任何函数指针。它们在访问时被缓存:
>>> from ctypes import *
>>> lib = cdll.testdll
>>> sorted(vars(lib))
['_FuncPtr', '_handle', '_name']
>>> lib.sum_alias(1, 2)
3
>>> sorted(vars(lib))
['_FuncPtr', '_handle', '_name', 'sum_alias']
关于python - 从 python 调用 c 函数是行不通的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21769594/
我正在尝试实现这个简单的幻灯片:http://codepen.io/rafaelcastrocouto/pen/doZNMo 但我没有成功,我不知道问题是什么,唯一显示的是幻灯片的最后一张图片,我添加
我对 Promise 还很陌生,我认为我没有正确理解它,因为我在代码中尝试它但没有成功。 我在 NodeJS 上有一个服务器,使用 Express 库和 express-promise var exp
为什么两个盒子都在右边,而不是居中对齐? fiddle :http://jsfiddle.net/gh76q/1/ 我尝试将方框 2 的位置更改为相对位置,它可以解决问题,但当鼠标悬停在方框 1 上时
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 4 年前。 如果我尝试这样的事情: int
这个问题在这里已经有了答案: scanf() leaves the newline character in the buffer (7 个答案) 关闭 4 年前。 如果我尝试这样的事情: int
我有一张我的小 table ,它似乎不起作用。 CSS 会告诉所有我想要的高度和宽度。我这样做的方式有误吗?或者我错过了什么? 为什么不是所有的边界都对齐? 表格、html 和 CSS 可以在这个 j
我正在尝试使用localStorage制作一个简单的程序。我创建了一个按钮来重置 localStorage 中的所有数据。不幸的是,它不起作用,我不知道为什么。 这是我的代码: var sl
我有一个 Div,我想做的是,当您将鼠标悬停在 div 1 上时,它会更改 div 2。 所以我可以通过 .div1:hover .div2 的 CSS 来做到这一点,这意味着当我将鼠标悬停在 1 上
出于某种原因,比较逻辑无法正常工作……它不会比较两个 NSDecimalNumber 对象。有时有效,有时无效。真的很奇怪。 if 语句适用于某些编译,有时则不然。这是正确的做法吗? 数据来自一个 j
我在 iOS 上使用 Phonegap 2.1.0。在我的 main.html 文件中,我使用 jQuery 加载了一些 html。 但是,我正在加载的其中一个 html 文件有自己的 Javascr
行不通,而嵌套
我一般不会嵌套像这样: The following: one two 我将使用 像那样嵌套反而。但是今天我用了但似乎 Emacs 和 Google Chrome 都会考虑外部 一看
我有 3 个框 (div-s)。 main-box里面有两个盒子。第一个 (Box1) 向右浮动,另一个 (Box2) 向左浮动。 两个框的高度都设置为 100%,所以当其中一个拉伸(stretch)
我是一名优秀的程序员,十分优秀!