您写的代码都是这个脚本给编译器发指令生成的

因为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
    INSTALL_RPATH_USE_LINK_PATH ON
    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库的时候我们导出了zapiCMake 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.html

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会设置如下变量,方便您的使用:

  1. ZAPI_INCLUDE_DIRSzapi库的头文件路径
  2. ZAPI_PHP_INCLUDE_PATHS 系统探测出的PHP的头文件路径
  3. ZAPI_LIBRARYzendAPI动态链接库名字
  4. ZAPI_PHP_EXTENSION_DIR 系统探测出的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-libraries

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/v3.9/command/add_library.html

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 命令详解: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!