2011-11-19 4 views
4

Cython을 사용하여 hello.pyx 파일을 exe 파일로 컴파일하려고합니다.CPython 소스 - STATIC python26.lib을 작성하는 방법은 무엇입니까?

첫 번째 단계는 "cython --cplus --embed hello.pyx"명령을 사용하여 hello.pypp 파일을 hello.cpp 파일로 컴파일하는 것입니다. Embed 옵션은 Generate a main() function that embeds the Python interpreter을 의미합니다. 나는 의존성이없는 독립적 인 exe를 만들려고 노력하고있다. hello.cpp에서

가 나는 #include "Python.h", 그래서 여기에서 파이썬 소스를 다운로드하고 있습니다 : http://www.python.org/download/releases/2.6.6/Gzip으로 압축 된 소스 타르 볼 (2.6.6)을 선택. 나는 include dir을 추가하고 Python26.lib가 누락되었다는 에러를 얻는다. 그래서 그것을 컴파일하려고합니다. 기본 빌드는 python26.lib를 만듭니다 만 200KB 밖에되지 않습니다. 정적 lib가 아니며 hello.cpp를 컴파일 할 때 누락 된 참조 오류가 발생합니다.

README에는 정적으로 빌드하는 방법에 대한 유용한 지침이 없습니다.

http://svn.python.org/projects/python/trunk/PCbuild/readme.txt

솔루션은 어떤 구성이 없습니다 : 그러나, 나는 트렁크 (3.x의)에서 파이썬의 최신 버전, 정적 건물에 대한 몇 가지 유용한 정보가 온라인 README 파일을 검색 좀했습니다 정적 라이브러리의 경우. 그러나 쉽게 DLL 대신 정적 라이브러리를 빌드합니다. "구성 유형"을 "정적 라이브러리 (.lib)"로 설정하고 전 처리기 매크로 "Py_ENABLE_SHARED"를 "Py_NO_ENABLE_SHARED"로 변경하기 만하면됩니다. "다중 스레드 DLL (/ MD)"에서 "다중 스레드 (/ MT)"로 "런타임 라이브러리"를 변경해야 할 수도 있습니다.

여기에도 세부 정보가 너무 많지 않습니다. 솔루션의 모든 프로젝트를 정적 라이브러리로 빌드하도록 설정합니까? 아니면 pythoncore 만? "Python"과 "Pythonw"프로젝트는 "Applications"이므로 런타임 라이브러리를/MT로만 변경할 수 있습니다. 다음은 내가하고있는 단계입니다.

  • "해제"모드로 변경.
  • 프로젝트 "파이썬"- /MT 설정하고 추가 처리기 정의 Py_NO_ENABLE_SHARED
  • 프로젝트 "Pythoncore"- Static library (.lib)로 구성 유형,/MT, Py_NO_ENABLE_SHARED
  • 프로젝트 "Pythonw"로 처리기 정의 Py_ENABLE_SHARED 교체 - 동일 같이 " Python "이라고합니다.
  • "Python"에서 빌드를 마우스 오른쪽 버튼으로 클릭하십시오. 빌드의

요약 :

는 빌드 : 5 1은 0이 실패

kill_python (ok) 
make_buildinfo (ok) 
make_versioninfo (ok) 
pythoncore (ok) 
w9xpopen (ok) 
python (4 errors) 

프로젝트를 생략 최신, 0, 실패, 성공 "Python"은 다음과 같습니다.

------ Build started: Project: python, Configuration: Release Win32 ------ 
Compiling... 
python.c 
Compiling resources... 
Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385 
Copyright (C) Microsoft Corporation. All rights reserved. 
Linking... 
pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol __Py_svnversion referenced in function _svnversion_init 
pythoncore.lib(getversion.obj) : error LNK2019: unresolved external symbol _Py_GetBuildInfo referenced in function _Py_GetVersion 
pythoncore.lib(dynload_win.obj) : error LNK2019: unresolved external symbol __Py_DeactivateActCtx referenced in function __PyImport_GetDynLoadFunc 
pythoncore.lib(dynload_win.obj) : error LNK2019: unresolved external symbol __Py_ActivateActCtx referenced in function __PyImport_GetDynLoadFunc 
d:\python\src4\PCbuild\\python.exe : fatal error LNK1120: 4 unresolved externals 
Build Time 0:02 

/PCbuild/디렉토리를 보면 "pythoncore.lib"(10MB)가 있지만 "python26.lib"가 없다는 것을 알 수 있습니다.

나는 이러한 오류에 대한 구글

, 나는 단지 mail.pythong.org에 하나의 대화를 찾을 수 : http://www.groupsrv.com/computers/about397568.html

나는 pythoncore 프로젝트에 prepreocessor 정의 "_USRDLL"를 제거했지만 여전히 오류가 동일합니다. pythoncore에서

전처리 정의는 다음과 같습니다

_USRDLL 
Py_BUILD_CORE 
Py_NO_ENABLE_SHARED 
WIN32 

하는 I는 "상속 값을"나는 다른 상자에서 참조 편집을 클릭하면 : 나는했습니다 때문에 NDEBUG가 이상한 것을

NDEBUG 
_WIN32 

모드를 해제로 변경했습니다.

모든 서비스 팩이 설치된 Visual Studio 2008 (Express는 아님)을 사용하고 있습니다.

btw. 이전에 전체 솔루션을 구축하려고 시도했지만 경로가 "../../dba-"로 시작하는 누락 된 파일에 대한 오류가있었습니다.


파이썬의 2.6.2과 2.6.6 버전을 컴파일 시도,하지만 그들은 모두 같은 오류를 던져 : pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol

+0

Cython 코드에서 외부 모듈을 사용하고 있지 않습니까? –

+0

@ IgnacioVazquez-Abrams : 아니요, Hello World의 간단한 인쇄물 만 있습니다. 'Hello.pyx' 소스 :'def sayhello() : \t 인쇄 "Hello world in Cython!" if __name__ == "__main__": \t sayhello()'. 문제는 정적 라이브러리를 구축하는 것이지 Cython 코드 자체를 만드는 것이 아닙니다. –

+2

NDEBUG은 "No Debug"를 의미하며 릴리스 빌드에서는 정상입니다. –

답변

2

내가 2.7까지 2.4 정적 파이썬을 구축 있었고, 그것을 수행 셋업을 위해 약간의 노력을 기울이십시오.

솔루션에서 사용 가능한 모든 프로젝트의 구성을/MT로 설정해야합니다. 정적 인 Python을 빌드하려면, SQLite 또는 OpenSSL과 같은 라이브러리를 포함하여 참조하는 모든 것이 정적이어야합니다. 실제로 포함되지 않은 .pyd 모듈의 경우에도 마찬가지입니다. 그렇지 않으면 나중에 가져올 수 없기 때문입니다.

는 또한 모듈/socketmodule.h의 상단이 편집해야 할 수도 있습니다 :

#else /* MS_WINDOWS */ 
# define inet_pton _msvc_inet_pton 
# define inet_ntop _msvc_inet_ntop 
# include <winsock2.h> 
# include <ws2tcpip.h> 
# include <wspiapi.h> 
# undef inet_pton 
# undef inet_ntop 

당신은 즉시 오류를 넘어 일단, 아마 필요한 몇 가지 다른 것들 :

  • 포함 된 매니페스트 생성을 사용하지 않도록 설정합니다. distutils의 ~ 650 행을 참조하십시오 msvc9compiler.py;/MT를 사용하여 빌드 할 때도이 파일을 생성한다는 사실은 버그입니다.

  • distutils msvccompiler/msvc9compiler.py의/MT에/MD를 변경하십시오. 그렇지 않으면 thirdparty 라이브러리가 올바르게 빌드되지 않기 때문입니다.

+0

아직이 답변으로 문제가 해결되었는지 여부를 확인하지 못했습니다. 오래전에 정적 라이브러리를 포기했습니다. DLL을 사용하고 있었고 다른 접근 방식을 선택했습니다. –