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
相关产品推荐
相关产品推荐

