gpt4 book ai didi

Python,导入错误 : undefined symbol: g_utf8_skip

转载 作者:行者123 更新时间:2023-11-28 17:39:04 24 4
gpt4 key购买 nike

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

所以我正在尝试为 Python 编写 C 扩展。我们称它为 mylib。这是头文件:

mylib.h

#ifndef mylib_H
#define mylib_H

#include <Python.h>
< ... >
#include <glib.h>
< ... >

setup.py:

from distutils.core import setup, Extension

include_list = [
"/usr/include/glib-2.0", "-lglib-2.0",
"/usr/lib/x86_64-linux-gnu/glib-2.0/include"
]

module = Extension('mylib', ['mylib.c'])

setup(name='mylib', version='1.0',
include_dirs=include_list,
ext_modules=[module])

如果我运行 python setup.py install,我会得到以下信息(我将其视为安装成功):

running install
running build
running build_ext
building 'mylib' extension
creating build
creating build/temp.linux-x86_64-2.7
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/glib-2.0 -I-lglib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/python2.7 -c mylib.c -o build/temp.linux-x86_64-2.7/mylib.o
mylib.c: In function ‘c_sound_utf8’:
mylib.c:117:5: warning: ‘g_unicode_canonical_decomposition’ is deprecated (declared at /usr/include/glib-2.0/glib/gunicode.h:627) [-Wdeprecated-declarations]
decomposition = g_unicode_canonical_decomposition(c_composed, &decomposition_len);
^
creating build/lib.linux-x86_64-2.7
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/mylib.o -o build/lib.linux-x86_64-2.7/mylib.so
running install_lib
copying build/lib.linux-x86_64-2.7/mylib.so -> /usr/local/lib/python2.7/dist-packages
running install_egg_info
Removing /usr/local/lib/python2.7/dist-packages/mylib-1.0.egg-info
Writing /usr/local/lib/python2.7/dist-packages/mylib-1.0.egg-info

但是当我尝试从 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

在 StackOverflow 闲逛了一段时间后,我想到我应该 1. 重建所需的库或 2. put all the links to needed 所有生成的模块名称之后。

重建没有成功(或者我做错了)。至于在其他一切之后放置指向所需库的链接——好吧,我没有找到让 distutils 改变其编译字符串中链接顺序的方法。 有办法吗?

我还尝试为我的扩展程序提供 extra_link_args/extra_compile_args(没有任何效果):

module = Extension('mylib', ['mylib.c'], 
extra_link_args=["-Xlinker", "-export-dynamic"])

我感到非常痛苦,并继续谷歌搜索。然后我发现了 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:

extra_link_args=["-I", "/usr/include/glib-2.0", "-l", "glib-2.0", "-I", "/usr/lib/x86_64-linux-gnu/glib-2.0/include"]

将它们附加到编译字符串的末尾。

关于Python,导入错误 : undefined symbol: g_utf8_skip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27149849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com