资讯专栏INFORMATION COLUMN

hellozapi项目CMake编译脚本详解-CPP开发PHP之旅第二节

Kerr1Gan / 565人阅读

摘要:项目编译脚本整体代码编译脚本逐行解说我们推荐的版本是这里如果您的版本低于的话,会报错。这里我们定义我们的项目名称为使用的编程语言为。这行代码的意思就是指示编译器使用的标准对代码进行编译。在项目中我们主要有三个文件,在这里进行添加。

原文链接:http://www.zendapi.org/manual...

因为 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
    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/...

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

ZAPI_INCLUDE_DIRS zapi 库的头文件路径

ZAPI_PHP_INCLUDE_PATHS 系统探测出的 PHP 的头文件路径

ZAPI_LIBRARY zendAPI 动态链接库名字

ZAPI_PHP_EXTENSION_DIR 系统探测出的 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 类型不了解,您可以点击下面的连接进行学习。因为 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 systemMODULE Target 的名字格式为 libextname.so,这行代码的作用就是将我们的扩展 MODULE Target 的输出名字设置为 hellozapi.so

set_target_properties 命令详解:https://cmake.org/cmake/help/...

target_link_libraries(hellozapi ${ZAPI_LIBRARIES})

这行代码的作用是将 hellozapi 扩展与 zendAPI 库进行连接,如果没有这一行,而您的代码的时候又使用了 zendAPI 里面的相关接口,会导致在运行时平台的动态库加载器 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/...

恭喜您,坚持看完了编译脚本的教程,接下来稍作休息,我们继续正式进入扩展代码编写环节,相信您已经快等不及了,好了不废话了, Let"s go!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25905.html

相关文章

  • hello zapi 项目准备工作-CPP开发PHP之旅第一节

    摘要:原文地址在新手学堂里面,我们将从零基于开发一个简单的扩展,这个扩展的名字叫做现在我们着手准备开发需要的环境吧。 原文地址: http://www.zendapi.org/manual... 在新手学堂里面,我们将从零基于 zendAPI 开发一个简单的 PHP 扩展,这个扩展的名字叫做 hellozapi , 现在我们着手准备开发需要的环境吧。 demo 的项目库地址 https://...

    khs1994 评论0 收藏0
  • C++ 开发 PHP 7 扩展之模块入口定义

    摘要:每一个扩展必须有一个描述对象,在中我们类主要的作用主要完成这个功能。表示我们扩展导出符号给其他库使用。文章使用的编程文档的引用连接参考手册参考手册原文链接开发扩展之模块入口定义 zendAPI 项目不提供任何底层的功能,只是封装了 zend engine 提供的功能,对上提供一个易用的编程接口。这篇文章中,我们将介绍 C++ 世界与 C 世界交汇的地方,在这里也是 zendAPI 的接...

    dabai 评论0 收藏0
  • C++ 开发 PHP 7 扩展之定义常量

    摘要:比如扩展的那么我们必须也在我们扩展中也定义几个常量玩玩啊,其实真的很简单,不信那咱们走着看。好了,到这里我们就把预定义常量就讲完了,我没有骗您吧,真的很简单,稍作调整让我们继续前进原文链接开发扩展之定义常量 大家如果经常阅读 PHP 官方手册的话会发现,在扩展那一章里面的每个扩展的介绍的时候,都有一节是 Predefined Constants 预定义常量,这些常量是不需要您在 PHP...

    syoya 评论0 收藏0
  • C++ 开发 PHP 7 扩展之原生常量定义

    摘要:大家如果经常阅读官方手册的话会发现,在扩展那一章里面的每个扩展的介绍的时候,都有一节是预定义常量,这些常量是不需要您在里面进行定义就可以使用的。比如扩展的那么我们必须也在我们扩展中也定义几个常量玩玩啊,其实真的很简单,不信那咱们走着看。 大家如果经常阅读 PHP 官方手册的话会发现,在扩展那一章里面的每个扩展的介绍的时候,都有一节是 Predefined Constants 预定义常量...

    zilu 评论0 收藏0
  • C++ 开发 PHP 7 扩展之原生函数定义

    摘要:第一步打开项目下的文件,在文件中输入我们的函数的原型声明代码。这行代码注册一个原型为的函数,当这个函数被执行的时候,我们的函数将被运行时调用。原文地址开发扩展之原生函数定义 在上一篇中我们在hellozapi扩展中我们定义了几个常量,但是一个有用的扩展,必须得有函数,没有函数的扩展啥用没有,如果您觉得定义函数很难的话,您又错了,zendAPI就是为了让您生活变得美好而生的,而不会让事情...

    asce1885 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<