【问题标题】:Does php-cpp work for C library?php-cpp 是否适用于 C 库?
【发布时间】:2015-02-04 18:16:05
【问题描述】:

我遇到了一个C library,我想从中使用PHP 中的函数。这个question 让我走上了php-cpp 的轨道。但是我在任何地方都不清楚是否可以将 php-cpp 用于纯 C。

互联网上的大多数消息来源都说将 C 与 C++ 混合起来很简单,所以我想知道是否值得花时间学习实现目标所需的知识。

【问题讨论】:

    标签: php c++ c


    【解决方案1】:

    但我不清楚是否可以将 php-cpp 用于纯 C。

    如果您尝试包含任何 C++ 代码,这些代码实际上具有 C 程序中不支持的 C++ 特性。它根本不会编译。

    互联网上的大多数消息来源都说将 C 与 C++ 混合起来很简单

    只有在将 C 代码包含到 C++ 程序中时才会出现这种情况。即便如此,也有一些例外。

    如果你这样做是因为你不懂 C++,如果你足够小心,你可以像 C 一样编写 C++ 程序(除了一些例外,比如 void 指针)。

    【讨论】:

      【解决方案2】:

      PHP-CPP 是一个 C++ 库,可用于开发 PHP 扩展。 不需要开发 PHP 扩展,尽管它可能会让您的生活更轻松一些。如果您不了解 C++,或者您不想使用它,您可以放心地忽略 PHP-CPP。有关开发 PHP 扩展(C 语言)的一些资源,请参阅“Getting Started with PHP Extension Development”。

      完全可以从 C++ 调用 C 库。在大多数情况下,可以使用完全相同的语法;最多,您可能需要用extern "C" { ... } 包装C 头文件。

      【讨论】:

      • 您的回答对我帮助很大。可能我正朝着不使用 php-cpp 的方向前进。但只是为了回答这个问题:理论上,使用你提到的extern "C" { ... } 东西在 php-cpp 中包含一个 C 库是完全可能的?
      【解决方案3】:

      是的,您可以在 PHP-CPP 中将 C 与 C++ 混合,但对于初学者来说这不是一个好方法,因为您必须了解两者的相关 API。

      对于那些能胜任这项任务的人,您需要从 PHP 中包含适当的头文件,就像您正在编写标准 C 扩展一样,例如

      #include <php.h>
      #include <php_globals.h>
      #include <php_main.h>
      #include <php_network.h>
      // etc
      

      您还需要为您的 PHP-CPP 项目修改 Makefile 并为您的 PHP 源位置添加准确的包含目录,对我来说是

      COMPILER_FLAGS = -I/usr/local/include/php -I/usr/local/include/php/main ... etc ... -Wall -c -O2 -std=c++11 -fpic -o
      

      将标准 PHP/ZEND API C 代码添加到您的 PHP-CPP 函数/类中

      Php::Value example(Php::Parameters &params)
      {
          zval myval;
          zend_string *hello, *world;
      
          hello = zend_string_init("hello", strlen("hello"), 0);
      
          /* Stores the string into the zval */
          ZVAL_STR(&myval, hello);
      
          /* Reads the C string, from the zend_string from the zval */
          php_printf("The string is %s", Z_STRVAL(myval));
      
          world = zend_string_init("world", strlen("world"), 0);
      
          /* Changes the zend_string into myval : replaces it by another one */
          Z_STR(myval) = world;
          zend_string_release(hello);
          zend_string_release(world);
      
          return Php::Value(Z_STRVAL(myval));
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 2023-03-13
        • 2015-05-09
        • 1970-01-01
        相关资源
        最近更新 更多