Python,导入错误:未定义符号:g\u utf8\u跳过
在StackOverflow上有几十个类似的问题,但经过几个小时的潜伏,我终于放弃了 所以我正试图为Python编写一个C扩展。让我们称之为mylib。以下是头文件: mylib.hPython,导入错误:未定义符号:g\u utf8\u跳过,python,compilation,distutils,Python,Compilation,Distutils,在StackOverflow上有几十个类似的问题,但经过几个小时的潜伏,我终于放弃了 所以我正试图为Python编写一个C扩展。让我们称之为mylib。以下是头文件: mylib.h #ifndef mylib_H #define mylib_H #include <Python.h> < ... > #include <glib.h> < ... > 如果我运行python setup.py install,我会得到以下结果(我认为安装成功)
#ifndef mylib_H
#define mylib_H
#include <Python.h>
< ... >
#include <glib.h>
< ... >
如果我运行python setup.py install
,我会得到以下结果(我认为安装成功):
但是,当我尝试从Python内部使用mylib
时,我得到了以下结果:
>>> import mylib
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /usr/local/lib/python2.7/dist-packages/mylib.so: undefined symbol: g_utf8_skip
我觉得很痛苦,一直在谷歌上搜索。然后我发现了关于SWIG的。我决定制作另一个库(大写)MYLIB
(我将MYLIB
的文件名和所有出现的文本更改为MYLIB
)。我写了一个shell脚本:
#!/bin/bash
GLIB_IMPORT_OPTS="-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0"
PY_IMPORT_OPTS="-I/usr/include/python2.7/ -lpython2.7"
swig -Wall -python MYLIB.i
gcc -fPIC -Wall -c MYLIB.c $GLIB_IMPORT_OPTS
gcc -fPIC -Wall -shared MYLIB.o MYLIB_wrap.c -o _MYLIB.so $GLIB_IMPORT_OPTS -L. $PY_IMPORT_OPTS $GLIB_IMPORT_OPTS
当我运行这个东西时,一切都很好(我可以导入库并用它做一些事情)。如您所见,这里的链接位于编译行的最末端。所以现在我试图理解:我用
distutils
的方式错过了什么?我怎样才能让它工作呢?嗯,实际上我找到了解决办法。A必须向额外链接参数添加库链接
:
extra_link_args=["-I", "/usr/include/glib-2.0", "-l", "glib-2.0", "-I", "/usr/lib/x86_64-linux-gnu/glib-2.0/include"]
它将它们附加到编译字符串的末尾。我发现在扩展构造函数的“额外编译参数”中添加-fPIC也有帮助。像这样:
my_module = Extension('modulename',
...
extra_compile_args=["-fPIC"]
sources = ['mycode.c'])
#!/bin/bash
GLIB_IMPORT_OPTS="-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0"
PY_IMPORT_OPTS="-I/usr/include/python2.7/ -lpython2.7"
swig -Wall -python MYLIB.i
gcc -fPIC -Wall -c MYLIB.c $GLIB_IMPORT_OPTS
gcc -fPIC -Wall -shared MYLIB.o MYLIB_wrap.c -o _MYLIB.so $GLIB_IMPORT_OPTS -L. $PY_IMPORT_OPTS $GLIB_IMPORT_OPTS
extra_link_args=["-I", "/usr/include/glib-2.0", "-l", "glib-2.0", "-I", "/usr/lib/x86_64-linux-gnu/glib-2.0/include"]
my_module = Extension('modulename',
...
extra_compile_args=["-fPIC"]
sources = ['mycode.c'])