hellozapi項目CMake編譯腳本詳解-CPP開發PHP之旅第二節

原文連接:www.zendapi.org/manual/0.0.…html

由於 zendAPI 採用的是 CMake 進行編譯,因此咱們的 hellozapi 項目也採用 CMake 進行編譯,可是若是您有更擅長的 build system 您也能夠按照本身的狀況進行選擇。只要您能保證能正常的找到 zendAPI 的頭文件,PHP 的頭文件和 zendAPI 的動態連接庫便可。c++

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, 使用的編程語言爲 CXXapi

set(CMAKE_CXX_STANDARD 11)複製代碼

基於 zendAPI 的擴展開發必須開啓 c++11 標準的選項,不然在編譯的時候咱們的 build system 會報錯。這行代碼的意思就是指示編譯器使用 c++11 的標準對代碼進行編譯。編程語言

list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/zapi")複製代碼

在咱們進行編譯 zendAPI 庫的時候咱們導出了 zapiCMake Targets,設置了這個 Target 的一些很重要的屬性,這些文件咱們都安裝在 zendAPI 的安裝路徑下,好比在個人 MacOS 環境下,zendAPI 安裝在 /usr/local
那麼咱們的導出 Target 文件的路徑爲 /usr/local/lib/cmake/zapi
通常狀況下,這個路徑不在 CMake Module 的搜索路徑下,這行代碼的做用就是將其添加到 CMake Module 的搜索路徑列表中。學習

list 命令詳解:cmake.org/cmake/help/…ui

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

  1. ZAPI_INCLUDE_DIRS zapi 庫的頭文件路徑
  2. ZAPI_PHP_INCLUDE_PATHS 系統探測出的 PHP 的頭文件路徑
  3. ZAPI_LIBRARY zendAPI 動態連接庫名字
  4. ZAPI_PHP_EXTENSION_DIR 系統探測出的 PHP 默認擴展安裝路徑

find_package 命令詳解:cmake.org/cmake/help/…
import target 命令詳解:cmake.org/cmake/help/…spa

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 項目中咱們主要有三個文件,在這裏進行添加。c++11

add_library 命令詳解:cmake.org/cmake/help/…

set_target_properties(hellozapi PROPERTIES 
    OUTPUT_NAME hellozapi
    PREFIX "")複製代碼

通常咱們的 PHP 擴展的名爲 extname.so 的格式,可是默認的狀況下 CMake build systemMODULE Target 的名字格式爲 libextname.so,這行代碼的做用就是將咱們的擴展 MODULE Target 的輸出名字設置爲 hellozapi.so

set_target_properties 命令詳解:cmake.org/cmake/help/…

target_link_libraries(hellozapi ${ZAPI_LIBRARIES})複製代碼

這行代碼的做用是將 hellozapi 擴展與 zendAPI 庫進行鏈接,若是沒有這一行,而您的代碼的時候又使用了 zendAPI 裏面的相關接口,會致使在運行時平臺的動態庫加載器 ld 報出符號不存在的錯誤。

target_link_libraries 命令詳解:cmake.org/cmake/help/…

install(TARGETS hellozapi DESTINATION ${ZAPI_PHP_EXTENSION_DIR})複製代碼

這行代碼指示 build system 把編譯好的 hellozapi Target 安裝到 PHP 默認的擴展路徑下。

install 命令詳解:cmake.org/cmake/help/…

恭喜您,堅持看完了編譯腳本的教程,接下來稍做休息,咱們繼續正式進入擴展代碼編寫環節,相信您已經快等不及了,好了不廢話了, Let's go!

相關文章
相關標籤/搜索