2017-04-20 1 views
2

저는 실제로 Cython 프로그램에 기존 C 라이브러리를 연결하려고합니다.Cython 동적 라이브러리 링크

I는 다음과 같이 선언 된 모든 기능을 라이브러리의 엔트리 포인트 헤더 (.H)에 액세스 할 수 있습니다 ... 나는 __declspec(dllexport)와 DLL을 만드는 데 사용되는 EXPORT_API을 가정

EXPORT_API int _stdcall LibFunction(); 

또한 .lib 및 .dll 파일에 액세스 할 수 있습니다. 내 사이 썬 python setup.py build_ext 컴파일 할 때

cdef extern from "include\\entrypoint.h": 
    int LibFunction() 

def c_LibFunction(): 
    LibFunction() 

그리고 난 다음 setup.py

from setuptools import setup, Extension 
from Cython.Distutils import build_ext 

NAME = 'testlib' 
REQUIRES = ['cython'] 
SRC_DIR = 'testlib' 
PACKAGES = [SRC_DIR] 

INCLUDE_DIR = 'testlib\include' 
LIB_DIR = 'testlib\lib' 

ext = Extension(SRC_DIR + '.wrapped', 
       [SRC_DIR + '/wrapped.pyx'], 
       include_dirs=[INCLUDE_DIR], 
       library_dirs = [LIB_DIR], 
       libraries=['cfunc', 'MyLib'] 
       ) 

if __name__ == "__main__": 
    setup(
      install_requires=REQUIRES, 
      packages=PACKAGES, 
      name=NAME, 
      ext_modules=[ext], 
      cmdclass={"build_ext": build_ext} 
      ) 

을 사용하고 그러나 :

나는 사이 썬의 일반적인 cdef extern from으로이 기능을 사용하려고했습니다 해결되지 않은 외부 참조가 있습니다.

error LNK2001: unresolved external symbol __imp_LibFunction

other thread에서 찾을 수 있듯이 정적 또는 동적 라이브러리 링크의 문제 일 것 같습니다.

나는 setuptools 컴파일 옵션에서 온 것 같아서, distutils documentation과 Cython documentation을 사용하여 조사를 시도했다.

사실 나는 또한 내 자신의 C 라이브러리 (cfunc.lib, 정적 라이브러리)를 만들려고했는데 위에서 설명한 것과 같은 방식으로이 라이브러리에서 함수를 사용할 수있었습니다.

또한 DUMPBIN을 MyLib.lib에 사용하고 있는데 심볼 int __cdecl LibFunction(void)을 발견했으며 예상대로 __imp_은 기호에 없습니다.

누군가가 무슨 일이 일어나고 있는지, 왜 계속되고 있는지 그리고 어떻게하면 내 문제를 해결할 수 있는지 정말 도움이 될 수 있습니다.

답변

1

나는 해결책을 찾았으므로 누군가가 도움이 필요하면 게시한다!

Visual Studio를 사용하여 Windows에서 코드를 컴파일합니다.

cfunc 프로젝트를 Visual C++ 프로젝트로 만든 경우에도 C++ 프로젝트로 컴파일되지 않고 C 프로젝트로 컴파일되므로 기본적으로 작동합니다 (.c 및 .h 파일 만 포함).

entrypoint.h에는 C 스타일의 함수 선언 만 포함되어 있지만 dll은 C++ 프로젝트로 컴파일되어 작동하지 않습니다. 이름이 잘못되었습니다.

그래서 language = 'c++'을 내 setup.py

에 추가했습니다.
관련 문제