如何在cffi中支持64位指针?

2024-04-26 04:40:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用cffi将Python模块与C库接口。在

我在Linux上一切都很好,但是我对MacOSX(Yosemite-64位)却很不适应。下面是我写的一个最小示例,它显示了问题:

foo.h

#ifndef FOO_H
#define FOO_H
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

void* mymalloc(size_t);

#ifdef __cplusplus
}
#endif
#endif

在食品.cpp

^{pr2}$

生成文件

run: foo.py libfoo.dylib
    DYLD_LIBRARY_PATH=. LIBRARY_PATH=. python foo.py

libfoo.dylib: foo.cpp foo.h
    g++ -dynamiclib -o $@ $<

在食品

import cffi

ffi = cffi.FFI()
ffi.cdef("""
         void* malloc(size_t);
         void* mymalloc(size_t);
         """)
api = ffi.verify("", libraries=['foo'])
result = api.malloc(4)
print "malloc", result
result = api.mymalloc(4)
print "mymalloc", result

所以这里没有什么特别的:一个简单的mymalloc(size_t)函数,它充当实际的malloc(size_t)的包装器,并在返回之前显示生成的指针。在

但是,当执行foo.py(使用make run)时,我看到以下输出:

g++ -dynamiclib -o libfoo.dylib foo.cpp
DYLD_LIBRARY_PATH=. LIBRARY_PATH=. python foo.py
malloc <cdata 'void *' 0x7fdba0e01670>
0x7fdba0e00280
mymalloc <cdata 'void *' 0xffffffffa0e00280>

mymalloc(size_t)的情况下,cffi似乎以某种方式截断/修改了指针积分值:我得到了0xffffffffa0e00280,而不是预期的{}。这基本上是指针的值,但只存储在32位上。malloc(size_t)具有完全相同的原型,但是cffi似乎正确地处理了它并返回了一个64位地址。在

我不知道我在这里做错了什么。有人知道吗?在


Tags: pathpysizefoolibraryplusresultcffi
1条回答
网友
1楼 · 发布于 2024-04-26 04:40:26

根据official answer的说法,我称verify()的方式是假的。在

正确代码应为:

import cffi

ffi = cffi.FFI()
code = """
    void* malloc(size_t);
    void* mymalloc(size_t);
"""
ffi.cdef(code)
api = ffi.verify(code, libraries=['foo'])
result = api.malloc(4)
print "malloc", result
result = api.mymalloc(4)
print "mymalloc", result

哪个指标产生了预期的结果!在

相关问题 更多 >