수십 개의 유사한 질문이 StackOverflow에 있지만 몇 시간 동안 숨어서 마침내 포기했습니다.Python, ImportError : undefined symbol : g_utf8_skip
그래서 파이썬 용 C 확장을 작성하려고합니다. mylib
이라고합시다. 여기에 헤더 파일입니다
mylib.h
#ifndef mylib_H
#define mylib_H
#include <Python.h>
<...>
#include <glib.h>
<...>
및 setup.py : 나는 python setup.py install
을 실행하면
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])
, 내가 나뿐만 촬영 한 (다음을 얻을 성공적인 설치) :
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
하지만 파이썬 내부에서 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
으로 변경).
#!/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
방법으로 놓쳤습니까? 어떻게 작동시킬 수 있습니까?