首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPython扩展如何调用在CPython中定义的函数?

CPython扩展如何调用在CPython中定义的函数?
EN

Stack Overflow用户
提问于 2020-03-31 22:11:38
回答 1查看 22关注 0票数 0

documentation for writing CPython extensions中,可以找到以下代码:

代码语言:javascript
复制
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return PyLong_FromLong(sts);
}

正如我们所看到的,外部C扩展中的这个函数能够使用(我认为)在主CPython解释器源代码中定义的函数:PyArg_ParseTuple

如果我们简单地直接构建扩展源文件(也称为gcc -shared myextension.c等),即使包含必要的头<Python.h>,链接器也会抱怨undefined reference to PyArg_ParseTupe

那么,如何构建CPython扩展,使它们能够自由引用CPython代码库中的函数呢?

扩展是否与实际解释器的源代码一起构建?它们是否与实际解释器的目标文件相关联?一种不同的方法?

请参考与Windows相关的方法。关于Linux的其他信息也是受欢迎的。

EN

回答 1

Stack Overflow用户

发布于 2020-03-31 22:14:32

在Linux中,相关的库调用是dlopen(),其中"dl“代表动态链接。The manual page says

如果可执行文件是用标志"-rdynamic“(或同义的"--export-dynamic")链接的,则可执行文件中的全局符号也将用于解析动态加载的库中的引用。

换句话说,来自动态加载库内部的引用在加载时由动态链接器解析。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60952654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档