文章目錄
- 摘要
- 環境
- 注意 - Python >= 3.7會導致編譯失敗
- 編譯方法
摘要
本文記述如何在windows 10上編譯mod_wsgi ( Python3.5 + Apache-2.4.39 )
環境
- win 10
- Apache-2.4.39 - https://www.apachelounge.com/download/
- Python-3.5
- Visual Studio 2019 (含c++開發組件)
- mod_wsgi - https://github.com/GrahamDumpleton/mod_wsgi [ 時效性: 本文用到的源碼下載于 2019-06-15 ]
注意 - Python >= 3.7會導致編譯失敗
mod_wsgi的源碼中存在如下內容, 而python37.lib文件中不存在函數PyOS_AfterFork_Child(),這就會導致使用的Python版本大于等于3.7都會導致編譯失敗,并在鏈接時提示錯誤 :無法解析的外部符號。
因此,本文使用Python 3.5 進行mod_wsgi的編譯
if
(
wsgi_python_initialized
&&
!
wsgi_python_after_fork
)
{
#
if
PY_MAJOR_VERSION > 3 || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 7)
PyOS_AfterFork_Child
(
)
;
#
else
PyOS_AfterFork
(
)
;
#
endif
}
編譯方法
-
找到編譯器 cl.exe, 將其位置寫入用戶環境變量PATH中。注意,請保證所有組件的位數一致,如均為64位,或均為32位。例如,在64位機器上編譯64位程序,需要使用 …MSVC編譯器目錄\bin\Hostx64\x64\cl.exe
-
在 https://github.com/GrahamDumpleton/mod_wsgi 下載mod_wsgi源碼,解壓到當前文件夾
-
進入目錄mod_wsgi/win32/,此目錄存放編譯mod_wsgi需要的Makefile文件,但到2019/06/15為止,里面沒有使用VS 2019和Python 3.5的Makefile,因此,接下來需要做三件事
- 復制"ap24py34-win64-VC10.mk",重命名為"ap24py35-win64-VC16.mk"
- 復制"common-VC10.mk",重命名為"common-VC16.mk"
- 復制"build-win64-VC10.bat",重命名為"build-win64-VC16.bat"
-
修改ap24py35-win64-VC16.mk為如下內容
APACHE_ROOTDIR = Apache2.4的文件夾路徑 PYTHON_ROOTDIR = Python3.5的文件夾路徑 PYTHON_VERSION = 35 MSVC_INCLUDE = MSVC編譯器的頭文件路徑 MSVC_LIB = MSVC編譯器的庫文件路徑 WINSDK_INCLUDE_UM = windows sdk的um頭文件路徑 WINSDK_INCLUDE_UCRT = windows sdk的ucrt頭文件路徑 WINSDK_INCLUDE_SHARE = windows sdk的shared頭文件路徑 WINSDK_LIB_UCRT = windows sdk的ucrt庫文件路徑 WINSDK_LIB_UM = windows sdk的um庫文件路徑 include common-VC16.mk
示例:
APACHE_ROOTDIR = D:\App-Server\Apache24.39-Win64-VS16\Apache24 PYTHON_ROOTDIR = D:\Dev\Python\Python35 PYTHON_VERSION = 35 MSVC_INCLUDE = C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include MSVC_LIB = C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\lib\x64 WINSDK_INCLUDE_UM = C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um WINSDK_INCLUDE_UCRT = C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt WINSDK_INCLUDE_SHARE = C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared WINSDK_LIB_UCRT = C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64 WINSDK_LIB_UM = C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64 include common-VC16.mk
-
修改 common-VC16.mk為如下內容
CPPFLAGS = \ /DWIN32 \ /DNDEBUG \ /I"$(MSVC_INCLUDE)" \ /I"$(WINSDK_INCLUDE_UM)" \ /I"$(WINSDK_INCLUDE_UCRT)" \ /I"$(WINSDK_INCLUDE_SHARE)" \ /I"$(PYTHON_ROOTDIR)\include" \ /I"$(APACHE_ROOTDIR)\include" CFLAGS = \ /MD \ /GF \ /Gy \ /O2 \ /Wall \ /Zc:wchar_t \ /Zc:forScope LDFLAGS = \ /link \ /LIBPATH:"$(APACHE_ROOTDIR)\lib" \ /LIBPATH:"$(PYTHON_ROOTDIR)\libs" \ /LIBPATH:"$(MSVC_LIB)" \ /LIBPATH:"$(WINSDK_LIB_UM)" \ /LIBPATH:"$(WINSDK_LIB_UCRT)" \ /OPT:REF \ /OPT:ICF=2 \ /RELEASE \ /SUBSYSTEM:WINDOWS LDLIBS = \ python$(PYTHON_VERSION).lib \ libhttpd.lib \ libapr-1.lib \ libaprutil-1.lib SRCFILES = ..\src\server\*.c mod_wsgi.so : $(SRCFILES) cl $(CPPFLAGS) $(CFLAGS) $(SRCFILES) /LD $(LDFLAGS) $(LDLIBS) /OUT:$@ VARIANT = py$(PYTHON_VERSION)-VC16 install : mod_wsgi.so copy $? $(APACHE_ROOTDIR)\modules\mod_wsgi-$(VARIANT).so : : : : : You now need to edit $(APACHE_ROOTDIR)\conf\httpd.conf and add: : : LoadModule wsgi_module modules/mod_wsgi-$(VARIANT).so : : : : clean : del *.obj *.so *.so.manifest *.lib *.exp
-
修改build-win64-VC16.bat為如下內容
nmake -f common-VC16.mk clean nmake -f ap24py35-win64-VC16.mk install nmake -f common-VC16.mk clean
-
最后,在命令行中執行此文件build-win64-VC16.bat,即可編譯成功, 編譯成功后會自動將mod_wsgi-py??-VC??.so (本文為mod_wsgi-py35-VC16.so)復制到Apache安裝目錄的modules文件夾內。加載此模塊仍需要自行修改Apache的配置文件。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
