原文連結:http://www.zendapi.org/manual…
因為 zendAPI
採用的是 CMake
進行編譯,所以我們的 hellozapi
專案也採用 CMake
進行編譯,但是如果您有更擅長的 build system
您也可以按照自己的情況進行選擇。只要您能保證能正常的找到 zendAPI
的標頭檔案,PHP
的標頭檔案和 zendAPI
的動態連結庫即可。
hellozapi 專案 CMake 編譯指令碼整體程式碼
cmake_minimum_required(VERSION 3.4.3 FATAL_ERROR)
project(hellozapi CXX)
set(CMAKE_CXX_STANDARD 11)
# register zapi cmake modules, you must modify
# this according to your self zapi install prefix
list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/zapi")
# here find zendAPI lib
find_package(zendAPI 0.0.1 EXACT REQUIRED CONFIG)
add_library(hellozapi MODULE
hellozapi/defs.h
hellozapi/defs.cpp
hellozapi/entry.cpp)
set_target_properties(hellozapi PROPERTIES
OUTPUT_NAME hellozapi
PREFIX "")
target_link_libraries(hellozapi ${ZAPI_LIBRARY})
install(TARGETS hellozapi DESTINATION ${ZAPI_PHP_EXTENSION_DIR})
CMake 編譯指令碼逐行解說
cmake_minimum_required(VERSION 3.4.3 FATAL_ERROR)
我們推薦的 CMake
版本是 3.4.3
, 這裡如果您的版本低於 3.4.3
的話,CMake
會報錯。
project(hellozapi CXX)
這裡我們定義我們的專案名稱為 hellozapi
, 使用的程式語言為 CXX
。
set(CMAKE_CXX_STANDARD 11)
基於 zendAPI
的擴充套件開發必須開啟 c++11
標準的選項,否則在編譯的時候我們的 build system
會報錯。這行程式碼的意思就是指示編譯器使用 c++11
的標準對程式碼進行編譯。
list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/zapi")
在我們進行編譯 zendAPI
庫的時候我們匯出了 zapi
的 CMake Targets
,設定了這個 Target
的一些很重要的屬性,這些檔案我們都安裝在 zendAPI
的安裝路徑下,比如在我的 MacOS
環境下,zendAPI
安裝在 /usr/local
那麼我們的匯出 Target
檔案的路徑為 /usr/local/lib/cmake/zapi
。
一般情況下,這個路徑不在 CMake Module
的搜尋路徑下,這行程式碼的作用就是將其新增到 CMake Module
的搜尋路徑列表中。
list 命令詳解:https://cmake.org/cmake/help/…
find_package(zendAPI 0.0.1 EXACT REQUIRED CONFIG)
這行程式碼探測我們系統中安裝的 zendAPI
庫相關資訊,zendAPI
只支援以 CMake CONFIG
模式尋找,這裡我們尋找我們系統中是否安裝有 zendAPI 0.0.1
版的庫,如果沒有的話,build system
在這裡會報錯。
如果成功尋找到 zendAPI 0.0.1
版的庫,build system
會設定一個 CMake Import Target
。
同時 find_package
會設定如下變數,方便您的使用:
- ZAPI_INCLUDE_DIRS
zapi
庫的標頭檔案路徑 - ZAPI_PHP_INCLUDE_PATHS 系統探測出的
PHP
的標頭檔案路徑 - ZAPI_LIBRARY
zendAPI
動態連結庫名字 - ZAPI_PHP_EXTENSION_DIR 系統探測出的
PHP
預設擴充套件安裝路徑
find_package 命令詳解:https://cmake.org/cmake/help/…
import target 命令詳解:https://cmake.org/cmake/help/…
add_library(hellozapi MODULE hellozapi/defs.h
hellozapi/defs.cpp
hellozapi/entry.cpp)
這行程式碼的主要作用是向 build system
新增一個 MODULE
型別的 CMake Target
,如果對 MODULE
型別不瞭解,您可以點選下面的連線進行學習。因為 PHP
擴充套件是被 Zend Engine
使用 dlopen
進行載入的,所以我們的型別
是 MODULE
而不是 SHARED
。在 hellozapi
專案中我們主要有三個檔案,在這裡進行新增。
add_library 命令詳解:https://cmake.org/cmake/help/…
set_target_properties(hellozapi PROPERTIES
OUTPUT_NAME hellozapi
PREFIX "")
一般我們的 PHP
擴充套件的名為 extname.so
的格式,但是預設的情況下 CMake build system
的 MODULE Target
的名字格式為 libextname.so
,這行程式碼的作用就是將我們的擴充套件 MODULE Target
的輸出名字設定為 hellozapi.so
。
set_target_properties 命令詳解:https://cmake.org/cmake/help/…
target_link_libraries(hellozapi ${ZAPI_LIBRARIES})
這行程式碼的作用是將 hellozapi
擴充套件與 zendAPI
庫進行連線,如果沒有這一行,而您的程式碼的時候又使用了 zendAPI
裡面的相關介面,會導致在執行時平臺的動態庫載入器 ld
報出符號不存在的錯誤。
target_link_libraries 命令詳解:https://cmake.org/cmake/help/…
install(TARGETS hellozapi DESTINATION ${ZAPI_PHP_EXTENSION_DIR})
這行程式碼指示 build system
把編譯好的 hellozapi Target
安裝到 PHP
預設的擴充套件路徑下。
install 命令詳解:https://cmake.org/cmake/help/…
恭喜您,堅持看完了編譯指令碼的教程,接下來稍作休息,我們繼續正式進入擴充套件程式碼編寫環節,相信您已經快等不及了,好了不廢話了, Let`s go!