Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,导入错误:未定义符号:g\u utf8\u跳过_Python_Compilation_Distutils - Fatal编程技术网

Python,导入错误:未定义符号:g\u utf8\u跳过

Python,导入错误:未定义符号: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,我会得到以下结果(我认为安装成功)

在StackOverflow上有几十个类似的问题,但经过几个小时的潜伏,我终于放弃了

所以我正试图为Python编写一个C扩展。让我们称之为mylib。以下是头文件:

mylib.h

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