2014-11-26 4 views
3

수십 개의 유사한 질문이 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 방법으로 놓쳤습니까? 어떻게 작동시킬 수 있습니까?

답변

2

글쎄, 실제로 해결책을 찾았습니다. 컴파일 문자열의 끝에 그들을 추가

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

: A는 라이브러리 링크 extra_link_args-를 추가했다.

0

Extension 생성자에서 "extra_compile_args"에 -fPIC을 추가하면 도움이됩니다. 좋아요 :

my_module = Extension('modulename', 
         ... 
         extra_compile_args=["-fPIC"] 
         sources = ['mycode.c'])