首頁  >  文章  >  後端開發  >  windows下用c/c++開發php擴展

windows下用c/c++開發php擴展

WBOY
WBOY原創
2016-08-08 09:29:041160瀏覽

一:所需工具:

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教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:PHP快取處理下一篇:PHP快取處理