在一个扩展模块中使用多个 C 代码 Python

Using multiples C codes in one extension module Python

我在 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 函数?

概况如下:

main.c

#include <Python.h>
#include "code.h"

//....

void send(char* name)
{
   //DO SOMETHING
   function_from_code(name)
}

code.c

.....

#include "code.h"

void function_from_code(char* name)
{
   //DO SOMETHING
}  

然后是 Python 代码:

import main

...

main.send("My Name")

这样,python 代码调用了 module 主 C 的函数(到目前为止一切顺利)。目前 main.ccode.c 调用一个函数,它抛出以下错误:

ImportError: /usr/local/lib/python2.7/dist-packages/main.so: undefined symbol: function_from_code

显然,使用 #include 是不够的。

评论太长了,我不确定它是否能解决问题。我认为这只是因为当 code.ccode.h 未明确列为源代码时它不会编译它们(参见 "Extension names and packages")。

就我个人而言,我会为 Extension 使用 depends 参数:

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']
                  )
        ]

不确定源文件或依赖文件的顺序是否重要...