原文连接: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!