一:所需工具:
cygwin ,它是一個在windows平台上運行的類unix模擬環境
php源碼(壓縮包)
php二進位文件,也就是安裝在windows上的php
vs2008 或更高(vs2010,vs2013)
win32build.rar和bindlib_win32.rar(主要用來產生config.win32.h)
二:配置過程
1: 解壓縮PHP源碼,裡面有ext目錄,這裡便是負責開發PHP擴充的目錄,目錄中有預設的所有擴展源碼,還有兩個文件,
ext_skel_win32.php 與 ext_skel檔案
ext_skel是創建擴展的shell,在windows上無法運行,所以必須要有cygwin模擬unix環境
2:解壓完之後,我們需要在ext目錄中生成我們自己的擴展目錄.
我們直接win+r cmd 進入命令列,然後cd 跳到ext目錄,輸入以下指令:
php ext_skel_win32.php –extname=myext 或
php.exe ext_skel_win32.php –extname=myext
這裡很容易出現錯誤
首先:php和php.exe指的是安裝在windows上的php,它的根目錄裡面有php.exe,目的是用來解析php文件,所以我們需要將安裝的php目錄設定到環境變數。
其次:如果沒有安裝cygwin或沒有設定cygwin,就會出現以下錯誤。所以,我們需要安裝cygwin,然後打開php源碼ext目錄中的ext_skel_win32.php ,裡面有一個變數叫做$cygwin_path = “c:/cygwin/bin”; 將它修改為你安裝的目錄並保存,try again
如果依舊報錯,請看這張圖,你是否犯錯了。
一切完成之後如果出現以下情況,則表明創建擴展目錄(骨架)成功,
裡麵包含的目錄大概是這個樣子,其中我們需要修改的兩個文件是(如箭頭所示)
3:添加依賴的php5ts.lib
將php二進位套件中的dev目錄下的php5ts.lib拷貝到你的擴充目錄中
4:(1)修改php_hello.h檔
擴充新的函數:在PHP_FUNCTION(confirm_myhello_compiled);行後面加入一行 PHP_FUNCTION(hello);
(2)修改hello.c 檔案
在陣列zend_function_entry myhello_functions[]增加一行
<code>1. zend_function_entry myhello_functions[] = { 2. PHP_FE(confirm_myhello_compiled, NULL) /* For testing, remove later. */ 3. PHP_FE(hello, NULL) // 新增的行 4. {NULL, NULL, NULL} /* Must be the last line in myhello_functions[] */ 5. }; </code>
在PHP_FUNCTION(confirm_myhello_compiled) 後加入我們的新函數
<code>1. PHP_FUNCTION(hello){ 2. php_printf(”Hello C extension”); 3. } 4. </code>
5:建立dllll檔案
接下來就是編譯擴充檔了,用vs2008開啟hello.dsp,選擇編譯方式為Release_TS,然後開始編譯,或者在透過命令列進入ext/hello 執行msdev hello.dsp /MAKE “hello - Win32 Release_TS” 如果成功,則會在ext同級目錄Release_TS中產生php_hello.dll。
到這裡基本主要任務基本上完成了,但這裡也是最容易出錯的。
最常見的錯誤 ,編譯時它會出現Cannot open include file “../main/config.win32.h” 結果到main資料夾根本就沒這個檔案。
所以,將win32build.rar和bindlib_win32.rar都解壓縮到php源碼中win32/build目錄下,並將win32/build加入環境變數
進入cmd 跳到php源碼目錄,輸入
cscript /nologo configure.js –with-php-build=”../win32build” –without-libxml –disable-odbc 回車後有可能出現
意思是沒有找打cl.exe,所以我們需要將安裝好的vs2008目錄中的的bin目錄添加到環境變量,我的機器上是”D:vs2008VCbin”,再次執行,有可能依舊會報錯,圖我找不到了。 。大概意思就是the c++ compiler is vc9.0(vs2008) at least 所以盡量使用vs2008以上的compiler
繼續執行:
這個檔案可以在Microsoft Visual Studio 10.0Common7IDEbin可。繼續執行語句,成功。在D:php原始碼main目錄下產生config.win32.h檔。
打開config.win32.h:找到裡面
如果你用vc10進行編譯,則需修改為
終於解決問題了,編譯。 。如果成功,產生dll,
但我還是遇見了編譯問題,fatal error c1902:程式資料庫管理器不符。 。
真是苦了,透過百度,在CSDN論壇上發現同樣的問題,最後是這樣解決的。
mspdbsrv.exe 或 mspdbcore.dll 遺失或其版本和 mspdb80.dll 的版本不同,確定這三個檔案的相同版本安裝在系統中。
在VC安裝目錄下的Common7IDE 目錄下拷貝這三個檔案到 安裝目錄下的VCbin下即可
所有問題解決,我也成功編譯出了php_hello.dll
6:最後,我們將其拷貝到二進制php目錄下的ext目錄,打開php.ini,添加上 extension=php_hello.dll
重啟apache,測試自己的函式。
PS:當時我測試的函數是cock()
輸出結果:
到此結束。 。 。搞這個東西真是快瘋了,還好耐心的解決問題多次嘗試,最後成功。我將自己所遇到的問題都貼了出來方便大家參考。 php擴充這東西挺好玩的,我們可以發展出自己的php函數。不過前提是c/c++要學的很好。 。 。總之慢慢來吧,祝大家早日成功~
以上就介紹了windows下用c/c++開發php擴展,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。