잘 모르겠지만 Elmer를 사용하여 Elmer를 사용하여 Python 2.7.8 및 Elmer 1.1.7a를 사용하여 Windows 7 x64에서 DLL을 만들 수있었습니다. 나는 내 경험을 나눌거야.
내 컴파일/환경을 구축이 VisualStudio2005 NMAKE
나는 특히 언 플래그 관련, 길을 따라 몇 가지 문제로 실행 않았다 비주얼 스튜디오 내 이전 버전을 사용 되었으나, 나는 것으로 보이는 무엇입니까 지금 작업중인 DLL.
내 최고 수준의 노트 :
내가 정적으로 인해 python27.dll가 포함 된 MSVCRT90와 DLL을 로딩하는 동안 충돌 MSVCRT80와 엘머 연결했다
- .
- 라이브러리 elmer.lib가 연결 단계에 필요했지만 c : \ elmer \ src \ build \ temp.win32-2.7 \ Release \ elmer 디렉토리에만 존재 했으므로 복사해야하는 것처럼 보입니다. 이름에 temp라는 단어가 없지만 임시 디렉토리에서 makefile을 사용하도록 설정했습니다.
- -frozen을 사용할 때 수십개의 생성 된 .c 파일이있을 수 있습니다.
- PyImport_FrozenModules 및 Py_FrozenFlag는 이미 다른 포함 파일 (pydebug)에 의해 선언되었습니다.
- 방금 할당 된 것이 아니라 PyImport_FrozenModules가 재정의되고 있습니다 (elPythonToC로 인해).
- DL_IMPORT (elPythonToC.py에서 사용됨)는 http://bugs.python.org/issue566100에 대해 사용되지 않습니다. 대신 PyApi_DATA를 사용해야한다고 생각하지만 실제적인 차이는 없습니다. EDIT PyImport_FrozenModules를 재정의 할 때 전체 블록을 삭제할 때 그다지 중요하지 않습니다.
- 결국 python27.dll, elmer.dll을 포함해야했습니다. MSVCRT90.dll도 python27.dll이 필요하므로 대상 컴퓨터에 MS 재배포 가능 설치 프로그램을 통해 설치해야한다고 생각합니다. 냉동을 사용하면 단 하나의 배포 가능 제품을 얻게된다면 좋겠지 만 내가 얻을 수있는 것을 취할 것입니다.
- 약간의 수정 (예 : 파이썬 경로가 c : \ python27 대신 c : \ python26)으로 파이썬 2.6.5에서 프로 시저를 실행할 수있었습니다.
- 먼저 python으로 스크립트를 테스트하십시오. elmer는 기형적 인 python이 포함 된 스크립트를 기꺼이 패키지합니다.
- 는 디버그 할 DLL을 만들 파이썬 코드 자체에서 포맷 된 의견이나 기능의 어떤 종류가에서 .elm 파일을 대체 할 수 있다면
- 좋은하여야 할 LINKFLAGS에 CFLAGS에
/Z7 /Od
및 /incremental:no /debug
을 추가합니다.
지금 여기에 자세한 단계는 내가 한의입니다 (이 중 하나라도 정확하고 확실하게 최적화되지 않았 음을 보증없이,하지만 그들은 나를 위해 작동하는 것 않았다) :
- 는 엘머 설치
- 내가 시작
, 나는 2.7.2를 사용하고 있었고, 난이 문제로 실행 :
- 다운로드 및 일부 디렉토리 엘머 압축을 풉니 다 (엘머 \, 그래서 난 내 예를 걸쳐 것을 사용합니다 나는 C를 포착) : Compiling with cython and mingw produces gcc: error: unrecognized command line option '-mno-cygwin' . Lib/distutils/cygwinccompiler.py를 -mno-cygwin을 제거하도록 설치하고 설치했지만 나중에 2.7.8을 설치했는데 근본적인 문제를 수정했다고 생각합니다.
- 이전 버전의 MSVCRT를 가지고 있기 때문에 Elmer.dll이 MSVCRT 정크에 정적으로 링크되기를 원했기 때문에 setup.py를 다음과 같이 수정했습니다. (내가 정적으로 연결하지 말아야 알고 당신은 아마 그것을 원하지 않지만, 경우에 당신이 :
이
- 윈도우 - 특정 빌드 옵션에서
libDirs = []
선언 아래
- 을
extraCompileArgs = []
및 extraLinkArgs = []
추가 블록 추가하는 경우 : extraCompileArgs = ['/MT']
및 extraLinkArgs = ['/MANIFEST']
- , 명령 프롬프트에서
Setup(..., ext_modules=[Extension(
- 내부
libraries=libs
후에 실행 C를 , extra_compile_args=extraCompileArgs, extra_link_args=extraLinkArgs
추가 : \ 엘머 \ SRC> 파이썬, 명령 프롬프트에서
- 실행 C를 건설있는 setup.py : \ 엘머 \ SRC> 파이썬 setup.py
설치
은 는
- 은 수정 평 내 요구에 맞게에서 .elm - 파일 - 언 옵션을 사용할 때
- makefrozen.py makefrozen를 얻는 엘머에서 사용하는 쉬운 부분이었다, 그러나이 표시되지 않습니다에 포함 할 표준 win32 MSI 배포판.
- makefrozen는 파이썬의 소스 코드에 포함되어 있지만, 윈도우 MSI 인스톨러에 포함되지 않은, 그래서 \ www.python.org
- 추출 \ 도구에서 소스 TAR 파일을 다운로드 C에 \ 동결 : \ python27
- 경로
SET PATH=%PATH%;%ELMERDIR%;%THISDIR%
을 가리켜 야 \ : \ 도구는 C에
- 수정 buildAndRun
- 변경 ELMERDIR을 동결 \ C에
- 설정 ELMERDIR는 : \ 엘머 업데이트 파일 내 구성에 대해 작업 할 수
\는 (예제 파일은 NMAKE 또는 냉동와 전혀 작동하지 않았다).
PYTHONDIR=C:\Python27
ELMERDIR=C:\elmer
ELMERLIBDIR=$(ELMERDIR)\src\build\temp.win32-2.7\Release\elmer
ELMER_OUTPUT_DIR=Generated
CC=cl
RM=del /F /Q
ELMER=$(ELMERDIR)\elmer
shell=call
CFLAGS=/TC /LD
INCLUDEFLAGS=/I$(ELMER_OUTPUT_DIR) /I$(PYTHONDIR)\include /I$(PYTHONDIR)\Lib\site-packages\elmer
LINKFLAGS=/LIBPATH:$(PYTHONDIR)\libs python27.lib /LIBPATH:$(ELMERLIBDIR) elmer.lib
.PHONY: generatedFiles generatedFrozen all allFrozen
SRCS = Generated\*.c
OBS = $(SRCS:.c=.obj)
{Generated}.c{Generated}.obj::
@echo Compiling...
@$(CC) /nologo $(CFLAGS) $(INCLUDEFLAGS) /c /FoGenerated\ $<
generatedFrozen:
echo Elmering
@$(shell) $(ELMER) -c -frozen -o $(ELMER_OUTPUT_DIR) -int MyDll.elm MyDll.py
generatedFiles:
echo Elmering
@$(shell) $(ELMER) -c -o $(ELMER_OUTPUT_DIR) -int MyDll.elm MyDll.py
showIncludeAndLinkFlags:
@echo includeDirs:
@$(shell) $(ELMER) --printIncludeFlags
@echo linkDirs:
@$(shell) $(ELMER) --printLinkFlags
MyDll.dll: $(OBS)
@echo Linking...
@Link $(LINKFLAGS) /DLL $(OBS)
all:
@echo "Making All"
@nmake generatedFiles
@nmake showIncludeAndLinkFlags
@nmake MyDll.dll
allFrozen:
@echo "Making All"
@nmake generatedFrozen
@nmake showIncludeAndLinkFlags
@nmake MyDll.dll
clean:
@echo cleaning
$(RM) .\Generated\*.* 2>nul || echo eatFailure >nul
- 이 NMAKE를 호출하기 전에 설정에 비주얼 스튜디오 환경을 경우 build.bat 만들기 : 여기에 NMAKE를 사용하여 냉동 또는 비 냉동 버전을 구축 할 수 있습니다 내 MAKEFILE입니다.여기 내 빌드 배치 파일의 내용은 다음과 같습니다
@ECHO OFF
SETLOCAL
SET THISDIR=%~dp0
REM Setup Visual Studio build environment
REM Microsoft Visual Studio 8 == Visual Studio 2005
CALL "C:\Program Files (x86)\Microsoft Visual Studio 8\VC\vcvarsall.bat"
nmake clean
nmake allFrozen
pause
ENDLOCAL
- 수정 컴파일/링크 오류, 내가 그것을
- 일 중복 선언을 제거하는 얻을 코드를 엘머 수정했다 여기 추악한 조금 가지고와 Py_FrozenFlag 및 PyImport_FrozenModules
- 열기 C에 대한 재정의 : \ python27 \ lib 디렉토리 \ 사이트 - 패키지 \ 엘머 \ elPythonToC.py을 텍스트 또는 파이썬 편집기에서
- 삭제 또는 0123을 포함하는
if(frozenFlag) :
블록을 주석및 retCode += "DL_IMPORT(struct _frozen *) PyImport_FrozenModules;\n"
(라인 145 정도)
- 라인을 추가
retCode += " PyImport_FrozenModules = _PyImport_FrozenModules;\n"
을 포함하는 선 위에 retCode += " retRunVal = PyImport_ImportFrozenModule((char*)\"%s\");\n"
(라인 189)
메일 폴더
- 복사 된 DLL
- 복사 MyDLL.dll .elm 파일이 들어있는 작업 디렉토리에서. C : \ elmer \ src \ build \ lib.win32-2.6 \ elmer에서 elmer.dll을 복사하십시오. C : \ Windows \ SysWOW64에서 python27.dll을 복사하십시오.
- 옆 DLL에. http://msdn.microsoft.com/en-us/library/vstudio/ms235299.aspx를 참조하는 병렬 구성과 물건을 대상 시스템에 필요한 (또는 어쩌면 당신의 창에 MSVCRT90.dll을 찾을 경우 비주얼 C++ 재배포 가능 패키지를 설치합니다.
내 DLL에 약간의 고기를 추가하면
편집 , 나는 냉동 수입 물건이 제대로 작동하지 않는 눈치과 종료 내 DLL을 일으키는 원인이되었다. 내 원래 수정 Py_FrozenFlag 및 PyImport_FrozenModules의 원인이 된 로컬로 정의 할 수, 발생하는 PyImpor t_ImportFrozenModule이 생성 된 C 코드 내에서 실패합니다. makefile을 수정하여 Py_NO_ENABLE_SHARED 정의를 제거하고 정의 및 선언을 제거하고 PyImport_FrozenModules의 정의를 할당으로 변경했으며 모든 것이 올바르게 작동하는 것처럼 보입니다. 성공적으로 연결하고 간단한 C++ 응용 프로그램에서 내 DLL을 디버깅했습니다.