在documentation for writing CPython extensions中,可以找到以下代码:
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的其他信息也是受欢迎的。
发布于 2020-03-31 22:14:32
在Linux中,相关的库调用是dlopen(),其中"dl“代表动态链接。The manual page says
如果可执行文件是用标志"
-rdynamic“(或同义的"--export-dynamic")链接的,则可执行文件中的全局符号也将用于解析动态加载的库中的引用。
换句话说,来自动态加载库内部的引用在加载时由动态链接器解析。
https://stackoverflow.com/questions/60952654
复制相似问题