You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP扩展开发报错:PHP_FE宏触发expected expression错误

PHP扩展编译错误:PHP_FE宏参数报错

我正在开发一个示例仓库,目标是将标准C函数封装为PHP内置函数,但编译时出现以下错误:

[ 27%] Building C object CMakeFiles/carbon_php.dir/bindings/php/carbon_php.c.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -Dcarbon_php_EXPORTS -I/Users/richardmiles/CLionProjects/OmniLang-C-Template/../php-src/main -I/Users/richardmiles/CLionProjects/OmniLang-C-Template/../php-src/Zend -I/Users/richardmiles/CLionProjects/OmniLang-C-Template/../php-src/TSRM -I/Users/richardmiles/CLionProjects/OmniLang-C-Template/../php-src -I/usr/local/Frameworks/Python.framework/Versions/3.12/include/python3.12 -I/Users/richardmiles/CLionProjects/OmniLang-C-Template/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk -fPIC -MD -MT CMakeFiles/carbon_php.dir/bindings/php/carbon_php.c.o -MF CMakeFiles/carbon_php.dir/bindings/php/carbon_php.c.o.d -o CMakeFiles/carbon_php.dir/bindings/php/carbon_php.c.o -c /Users/richardmiles/CLionProjects/OmniLang-C-Template/bindings/php/carbon_php.c
/Users/richardmiles/CLionProjects/OmniLang-C-Template/bindings/php/carbon_php.c:14:55: error: expected expression
        PHP_FE(carbon_version, arginfo_carbon_version),
                                                      ^
/Users/richardmiles/CLionProjects/OmniLang-C-Template/bindings/php/carbon_php.c:15:63: error: expected expression
        PHP_FE(carbon_hello_world, arginfo_carbon_hello_world),
                                                              ^

尝试过将显式参数定义替换为NULL,但问题未解决。之前在PHP_SRC中添加PHP函数的方式可行,但独立仓库中出现该问题,使用Clion开发,排除语法问题。

核心代码片段

/src/carbon.c

const char* carbon_version() {
    return "CarbonC 1.0.0";
}

const char* helloWorld() {
    return  "Hello World!";
}

/bindings/php/carbon_php.c(头文件部分)

#ifndef CARBON_PHP_H
#define CARBON_PHP_H

#include <php.h>
#include "carbon.h"

PHP_FUNCTION(carbon_version);
PHP_FUNCTION(carbon_hello_world);

extern zend_module_entry carbon_module_entry;
#define phpext_carbon_ptr &carbon_module_entry

ZEND_BEGIN_ARG_INFO(arginfo_carbon_version, 0)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO(arginfo_carbon_hello_world, 0)
ZEND_END_ARG_INFO()

#endif // CARBON_PHP_H

/bindings/php/carbon_php.c(实现部分)

#include "carbon_php.h"

PHP_FUNCTION(carbon_version) {
        const char* version = carbon_version();
        RETURN_STRING(version);
}

PHP_FUNCTION(carbon_hello_world) {
        const char* message = helloWorld();
        RETURN_STRING(message);
}

const zend_function_entry carbon_functions[] = {
        PHP_FE(carbon_version, arginfo_carbon_version),
        PHP_FE(carbon_hello_world, arginfo_carbon_hello_world),
        PHP_FE_END
};

zend_module_entry carbon_module_entry = {
        STANDARD_MODULE_HEADER,
        "carbon",                   // Extension name
        carbon_functions,           // Functions
        NULL,                       // MINIT
        NULL,                       // MSHUTDOWN
        NULL,                       // RINIT
        NULL,                       // RSHUTDOWN
        NULL,                       // MINFO
        "1.0.0",                    // Version
        STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_CARBON
ZEND_GET_MODULE(carbon)
#endif

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(OmniLangC VERSION 1.0)

# Core C library
add_library(carbon SHARED src/carbon.c)
target_include_directories(carbon PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

# Set the path to your PHP source directory
set(PHP_SRC_DIR "../php-src")

# Allow user to specify PHP_SRC_DIR via environment variable or CMake command line
if (DEFINED ENV{PHP_SRC_DIR})
    set(PHP_SRC_DIR $ENV{PHP_SRC_DIR})
endif()

# Add PHP include directories
include_directories(
        ${PHP_SRC_DIR}/main
        ${PHP_SRC_DIR}/Zend
        ${PHP_SRC_DIR}/TSRM
)

# Check if PHP headers are found
if (NOT EXISTS "${PHP_SRC_DIR}/main/php.h" OR NOT EXISTS "${PHP_SRC_DIR}/Zend/zend.h" OR NOT EXISTS "${PHP_SRC_DIR}/TSRM/TSRM.h")
    message(FATAL_ERROR "Could not find PHP headers. Please ensure PHP_SRC_DIR is set correctly.")
else()
    message(STATUS "Found PHP headers in ${PHP_SRC_DIR}")
endif()

# PHP binding
add_library(carbon_php SHARED bindings/php/carbon_php.c)
target_include_directories(carbon_php PUBLIC ${PHP_SRC_DIR}/main ${PHP_SRC_DIR}/Zend ${PHP_SRC_DIR}/TSRM ${PHP_SRC_DIR})
target_link_libraries(carbon_php carbon)

# Python binding
find_package(PythonInterp REQUIRED)
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})

set(CYTHON_PYX_FILE ${CMAKE_CURRENT_SOURCE_DIR}/bindings/python/carbon.pyx)
set(CYTHON_C_FILE ${CMAKE_CURRENT_SOURCE_DIR}/bindings/python/carbon.c)

add_custom_command(
        OUTPUT ${CYTHON_C_FILE}
        COMMAND cython --cplus -3 ${CYTHON_PYX_FILE} -o ${CYTHON_C_FILE}
        DEPENDS ${CYTHON_PYX_FILE}
        COMMENT "Generating C source from ${CYTHON_PYX_FILE}"
)

add_library(carbon_python MODULE ${CYTHON_C_FILE})
target_link_libraries(carbon_python ${PYTHON_LIBRARIES} carbon)
target_include_directories(carbon_python PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bindings/python)

# Ruby binding
add_library(carbon_ruby SHARED bindings/ruby/carbon_ruby.c)
target_include_directories(carbon_ruby PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bindings/ruby)
target_link_libraries(carbon_ruby carbon)

# Node.js binding
add_library(carbon_node SHARED bindings/node/carbon_node.cpp)
target_include_directories(carbon_node PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bindings/node)
target_link_libraries(carbon_node carbon)

本地运行配置可查看仓库README.md。

内容的提问来源于stack exchange,提问作者Richard Tyler Miles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:42:06