我在 Python 项目中使用了 C 代码,如 this教程。
我构建了一个扩展,以便可以通过 Python 调用 main.c
代码中的 A
函数。但是,函数 A
会调用名为 code.c
的文件中存在的其他各种函数,我在使用这些函数时遇到了问题。
如果所有的函数都放在main.c
中是没有问题的,但是出于组织的原因我想将这个项目模块化!
构建模块的setup.py
如下。
ext = [
Extension(
'main',
sources = ['main.c'] ,
extra_compile_args=['-lpq'] ,
extra_link_args = ['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
setup(name='project', version='1.0', ext_modules = ext)
我如何修改它,以便可以在 main.c
中毫无问题地使用 code.c
函数?
这里是情况的概要:
主.c
#include <Python.h>
#include "code.h"
//....
void send(char* name)
{
//DO SOMETHING
function_from_code(name)
}
代码.c
.....
#include "code.h"
void function_from_code(char* name)
{
//DO SOMETHING
}
然后是 Python 代码:
import main
...
main.send("My Name")
因此,python 代码以这种方式调用了 module
main C 的函数(到目前为止一切正常)。此时 main.c
从 code.c
调用一个函数,它抛出以下错误:
ImportError: /usr/local/lib/python2.7/dist-packages/main.so: undefined symbol: function_from_code
显然,使用 #include
是不够的。
最佳答案
评论太长了,我不确定它是否能解决问题。我认为这只是因为它不编译 code.c
和 code.h
当它们没有被明确列为源代码时(参见 "Extension names and packages" )。
我个人会使用 depends
Extension
的参数:
from glob import glob
ext = [Extension('main',
sources=['main.c'] ,
depends=glob('*.c') + glob('*.h'),
extra_compile_args=['-lpq'] ,
extra_link_args=['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
或者列出source
中的所有文件:
ext = [Extension('main',
sources=['main.c', 'code.h', 'code.c'] ,
extra_compile_args=['-lpq'] ,
extra_link_args=['-L/usr/local/pgsql/lib','-lpq'],
language=['c']
)
]
不确定源文件或依赖文件的顺序是否重要...
关于python - 在一个扩展模块 Python 中使用多个 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294895/