原文連接:http://www.zendapi.org/manual/0.0.1/getstarted/buildscriptdesc.htmlhtml
由於 zendAPI
採用的是 CMake
進行編譯,因此咱們的 hellozapi
項目也採用 CMake
進行編譯,可是若是您有更擅長的 build system
您也能夠按照本身的狀況進行選擇。只要您能保證能正常的找到 zendAPI
的頭文件,PHP
的頭文件和 zendAPI
的動態連接庫便可。c++
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_minimum_required(VERSION 3.4.3 FATAL_ERROR)
咱們推薦的 CMake
版本是 3.4.3
, 這裏若是您的版本低於 3.4.3
的話,CMake
會報錯。編程
project(hellozapi CXX)
這裏咱們定義咱們的項目名稱爲 hellozapi
, 使用的編程語言爲 CXX
。api
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/v3.9/command/list.htmlui
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
會設置以下變量,方便您的使用:this
zapi
庫的頭文件路徑PHP
的頭文件路徑zendAPI
動態連接庫名字PHP
默認擴展安裝路徑find_package 命令詳解:https://cmake.org/cmake/help/v3.9/command/find_package.html import target 命令詳解:https://cmake.org/cmake/help/v3.9/command/add_library.html#imported-librariesc++11
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
項目中咱們主要有三個文件,在這裏進行添加。code
add_library 命令詳解:https://cmake.org/cmake/help/v3.9/command/add_library.html
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/v3.9/command/set_target_properties.html
target_link_libraries(hellozapi ${ZAPI_LIBRARIES})
這行代碼的做用是將 hellozapi
擴展與 zendAPI
庫進行鏈接,若是沒有這一行,而您的代碼的時候又使用了 zendAPI
裏面的相關接口,會致使在運行時平臺的動態庫加載器 ld
報出符號不存在的錯誤。
target_link_libraries 命令詳解:https://cmake.org/cmake/help/v3.9/command/target_link_libraries.html
install(TARGETS hellozapi DESTINATION ${ZAPI_PHP_EXTENSION_DIR})
這行代碼指示 build system
把編譯好的 hellozapi Target
安裝到 PHP
默認的擴展路徑下。
install 命令詳解:https://cmake.org/cmake/help/v3.9/command/install.html#installing-targets
恭喜您,堅持看完了編譯腳本的教程,接下來稍做休息,咱們繼續正式進入擴展代碼編寫環節,相信您已經快等不及了,好了不廢話了, Let's go!