摘要:項目編譯腳本整體代碼編譯腳本逐行解說我們推薦的版本是這里如果您的版本低于的話,會報錯。這里我們定義我們的項目名稱為使用的編程語言為。這行代碼的意思就是指示編譯器使用的標(biāo)準(zhǔn)對代碼進行編譯。在項目中我們主要有三個文件,在這里進行添加。
原文鏈接:http://www.zendapi.org/manual...
因為 zendAPI 采用的是 CMake 進行編譯,所以我們的 hellozapi 項目也采用 CMake 進行編譯,但是如果您有更擅長的 build system 您也可以按照自己的情況進行選擇。只要您能保證能正常的找到 zendAPI 的頭文件,PHP 的頭文件和 zendAPI 的動態(tài)鏈接庫即可。
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 的擴展開發(fā)必須開啟 c++11 標(biāo)準(zhǔn)的選項,否則在編譯的時候我們的 build system 會報錯。這行代碼的意思就是指示編譯器使用 c++11 的標(biāo)準(zhǔn)對代碼進行編譯。
list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/zapi")
在我們進行編譯 zendAPI 庫的時候我們導(dǎo)出了 zapi 的 CMake Targets,設(shè)置了這個 Target 的一些很重要的屬性,這些文件我們都安裝在 zendAPI 的安裝路徑下,比如在我的 MacOS 環(huán)境下,zendAPI 安裝在 /usr/local
那么我們的導(dǎo)出 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)
這行代碼探測我們系統(tǒng)中安裝的 zendAPI 庫相關(guān)信息,zendAPI 只支持以 CMake CONFIG 模式尋找,這里我們尋找我們系統(tǒng)中是否安裝有 zendAPI 0.0.1 版的庫,如果沒有的話,build system 在這里會報錯。
如果成功尋找到 zendAPI 0.0.1 版的庫,build system 會設(shè)置一個 CMake Import Target。
同時 find_package 會設(shè)置如下變量,方便您的使用:
ZAPI_INCLUDE_DIRS zapi 庫的頭文件路徑
ZAPI_PHP_INCLUDE_PATHS 系統(tǒng)探測出的 PHP 的頭文件路徑
ZAPI_LIBRARY zendAPI 動態(tài)鏈接庫名字
ZAPI_PHP_EXTENSION_DIR 系統(tǒng)探測出的 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 類型不了解,您可以點擊下面的連接進行學(xué)習(xí)。因為 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 的輸出名字設(shè)置為 hellozapi.so。
set_target_properties 命令詳解:https://cmake.org/cmake/help/...
target_link_libraries(hellozapi ${ZAPI_LIBRARIES})
這行代碼的作用是將 hellozapi 擴展與 zendAPI 庫進行連接,如果沒有這一行,而您的代碼的時候又使用了 zendAPI 里面的相關(guān)接口,會導(dǎo)致在運行時平臺的動態(tài)庫加載器 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/...
恭喜您,堅持看完了編譯腳本的教程,接下來稍作休息,我們繼續(xù)正式進入擴展代碼編寫環(huán)節(jié),相信您已經(jīng)快等不及了,好了不廢話了, Let"s go!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25905.html
摘要:原文地址在新手學(xué)堂里面,我們將從零基于開發(fā)一個簡單的擴展,這個擴展的名字叫做現(xiàn)在我們著手準(zhǔn)備開發(fā)需要的環(huán)境吧。 原文地址: http://www.zendapi.org/manual... 在新手學(xué)堂里面,我們將從零基于 zendAPI 開發(fā)一個簡單的 PHP 擴展,這個擴展的名字叫做 hellozapi , 現(xiàn)在我們著手準(zhǔn)備開發(fā)需要的環(huán)境吧。 demo 的項目庫地址 https://...
摘要:每一個擴展必須有一個描述對象,在中我們類主要的作用主要完成這個功能。表示我們擴展導(dǎo)出符號給其他庫使用。文章使用的編程文檔的引用連接參考手冊參考手冊原文鏈接開發(fā)擴展之模塊入口定義 zendAPI 項目不提供任何底層的功能,只是封裝了 zend engine 提供的功能,對上提供一個易用的編程接口。這篇文章中,我們將介紹 C++ 世界與 C 世界交匯的地方,在這里也是 zendAPI 的接...
摘要:比如擴展的那么我們必須也在我們擴展中也定義幾個常量玩玩啊,其實真的很簡單,不信那咱們走著看。好了,到這里我們就把預(yù)定義常量就講完了,我沒有騙您吧,真的很簡單,稍作調(diào)整讓我們繼續(xù)前進原文鏈接開發(fā)擴展之定義常量 大家如果經(jīng)常閱讀 PHP 官方手冊的話會發(fā)現(xiàn),在擴展那一章里面的每個擴展的介紹的時候,都有一節(jié)是 Predefined Constants 預(yù)定義常量,這些常量是不需要您在 PHP...
摘要:大家如果經(jīng)常閱讀官方手冊的話會發(fā)現(xiàn),在擴展那一章里面的每個擴展的介紹的時候,都有一節(jié)是預(yù)定義常量,這些常量是不需要您在里面進行定義就可以使用的。比如擴展的那么我們必須也在我們擴展中也定義幾個常量玩玩啊,其實真的很簡單,不信那咱們走著看。 大家如果經(jīng)常閱讀 PHP 官方手冊的話會發(fā)現(xiàn),在擴展那一章里面的每個擴展的介紹的時候,都有一節(jié)是 Predefined Constants 預(yù)定義常量...
摘要:第一步打開項目下的文件,在文件中輸入我們的函數(shù)的原型聲明代碼。這行代碼注冊一個原型為的函數(shù),當(dāng)這個函數(shù)被執(zhí)行的時候,我們的函數(shù)將被運行時調(diào)用。原文地址開發(fā)擴展之原生函數(shù)定義 在上一篇中我們在hellozapi擴展中我們定義了幾個常量,但是一個有用的擴展,必須得有函數(shù),沒有函數(shù)的擴展啥用沒有,如果您覺得定義函數(shù)很難的話,您又錯了,zendAPI就是為了讓您生活變得美好而生的,而不會讓事情...
閱讀 2984·2021-09-10 10:50
閱讀 3188·2019-08-30 14:19
閱讀 3515·2019-08-29 17:31
閱讀 3241·2019-08-29 16:43
閱讀 2191·2019-08-29 14:05
閱讀 2088·2019-08-29 13:17
閱讀 2041·2019-08-26 13:25
閱讀 1756·2019-08-26 12:20