- 论坛徽章:
- 0
|
回复 #6 HonestQiao 的帖子
麻烦你帮我看看这样做正确不:
1 进入php5.3.0/ext目录, 执行:
./ext_skel --extname=vehicles
2 修改.cc及.h文件:
php_vehicles.h:
- #ifndef PHP_VEHICLES_H
- #define PHP_VEHICLES_H
- #define PHP_VEHICLES_EXTNAME "vehicles"
- #define PHP_VEHICLES_EXTVER "0.1"
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- extern "C" {
- #include "php.h"
- }
- extern zend_module_entry vehicles_module_entry;
- #define phpext_vehicles_ptr &vehicles_module_entry;
- #endif /* PHP_VEHICLES_H */
复制代码
vehicles.cc:
- #include "php_vehicles.h"
- #include "car.h"
- #include <iostream>
- using namespace std;
- zend_object_handlers car_object_handlers;
- zend_class_entry *car_ce;
- struct car_object {
- zend_object std;
- Car *car;
- };
- void car_free_storage(void *object TSRMLS_DC)
- {
- car_object *obj = (car_object *)object;
- delete obj->car;
- zend_hash_destroy(obj->std.properties);
- FREE_HASHTABLE(obj->std.properties);
- efree(obj);
- }
- zend_object_value car_create_handler(zend_class_entry *type TSRMLS_DC)
- {
- zval *tmp;
- zend_object_value retval;
- car_object *obj = (car_object *)emalloc(sizeof(car_object));
- memset(obj, 0, sizeof(car_object));
- obj->std.ce = type;
- ALLOC_HASHTABLE(obj->std.properties);
- zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
- zend_hash_copy(obj->std.properties, &type->default_properties,
- (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));
- retval.handle = zend_objects_store_put(obj, NULL,
- car_free_storage, NULL TSRMLS_CC);
- retval.handlers = &car_object_handlers;
- return retval;
- }
- PHP_METHOD(Car, __construct)
- {
- long maxGear;
- Car *car = NULL;
- zval *object = getThis();
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &maxGear) == FAILURE) {
- RETURN_NULL();
- }
- car = new Car(maxGear);
- car_object *obj = (car_object *)zend_object_store_get_object(object TSRMLS_CC);
- obj->car = car;
- }
- PHP_METHOD(Car, shift)
- {
- }
- PHP_METHOD(Car, accelerate)
- {
- Car *car;
- car_object *obj = (car_object *)zend_object_store_get_object(
- getThis() TSRMLS_CC);
- car = obj->car;
- if (car != NULL) {
- car->accelerate();
- }
- }
- PHP_METHOD(Car, brake)
- {
- }
- PHP_METHOD(Car, getCurrentSpeed)
- {
- Car *car;
- car_object *obj = (car_object *)zend_object_store_get_object(
- getThis() TSRMLS_CC);
- car = obj->car;
- if (car != NULL) {
- RETURN_LONG(car->getCurrentSpeed());
- }
- RETURN_NULL();
- }
- PHP_METHOD(Car, getCurrentGear)
- {
- }
- function_entry car_methods[] = {
- PHP_ME(Car, __construct, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
- PHP_ME(Car, shift, NULL, ZEND_ACC_PUBLIC)
- PHP_ME(Car, accelerate, NULL, ZEND_ACC_PUBLIC)
- PHP_ME(Car, brake, NULL, ZEND_ACC_PUBLIC)
- PHP_ME(Car, getCurrentSpeed, NULL, ZEND_ACC_PUBLIC)
- PHP_ME(Car, getCurrentGear, NULL, ZEND_ACC_PUBLIC)
- {NULL, NULL, NULL}
- };
- PHP_MINIT_FUNCTION(vehicles)
- {
- zend_class_entry ce;
- INIT_CLASS_ENTRY(ce, "Car", car_methods);
- car_ce = zend_register_internal_class(&ce TSRMLS_CC);
- car_ce->create_object = car_create_handler;
- memcpy(&car_object_handlers,
- zend_get_std_object_handlers(), sizeof(zend_object_handlers));
- car_object_handlers.clone_obj = NULL;
- return SUCCESS;
- }
- zend_module_entry vehicles_module_entry = {
- #if ZEND_MODULE_API_NO >= 20010901
- STANDARD_MODULE_HEADER,
- #endif
- PHP_VEHICLES_EXTNAME,
- NULL, /* Functions */
- PHP_MINIT(vehicles), /* MINIT */
- NULL, /* MSHUTDOWN */
- NULL, /* RINIT */
- NULL, /* RSHUTDOWN */
- NULL, /* MINFO */
- #if ZEND_MODULE_API_NO >= 20010901
- PHP_VEHICLES_EXTVER,
- #endif
- STANDARD_MODULE_PROPERTIES
- };
- #ifdef COMPILE_DL_VEHICLES
- extern "C" {
- ZEND_GET_MODULE(vehicles)
- }
- #endif
复制代码
car.h:
- #ifndef VEHICLES_CAR_H
- #define VEHICLES_CAR_H
- // A very simple car class
- class Car {
- public:
- Car(int maxGear);
- void shift(int gear);
- void accelerate();
- void brake();
- int getCurrentSpeed();
- int getCurrentGear();
- private:
- int maxGear;
- int currentGear;
- int speed;
- };
- #endif /* VEHICLES_CAR_H */
复制代码
car.c
- #include "car.h"
- Car::Car(int maxGear) {
- this->maxGear = maxGear;
- this->currentGear = 1;
- this->speed = 0;
- }
- void Car::shift(int gear) {
- if (gear < 1 || gear > maxGear) {
- return;
- }
- currentGear = gear;
- }
- void Car::accelerate() {
- speed += (5 * this->getCurrentGear());
- }
- void Car::brake() {
- speed -= (5 * this->getCurrentGear());
- }
- int Car::getCurrentSpeed() {
- return speed;
- }
- int Car::getCurrentGear() {
- return currentGear;
- }
复制代码
3 修改config.m4文件:
config.m4:
- PHP_ARG_ENABLE(vehicles,
- [Whether to enable the "vehicles" extension],
- [ --enable-vehicles Enable "vehicles" extension support])
- if test $PHP_VEHICLES != "no"; then
- PHP_REQUIRE_CXX()
- PHP_SUBST(VEHICLES_SHARED_LIBADD)
- PHP_ADD_LIBRARY(stdc++, 1, VEHICLES_SHARED_LIBADD)
- PHP_NEW_EXTENSION(vehicles, vehicles.cc car.cc, $ext_shared)
- fi
复制代码
4 phpize
5 ./configure --enable-vehicles
6 make
在这里编译过了, 但有几个warnning, 关于char*类型转换的. 不会因为几个warnning的问题吧??
7 make install
nstalling shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20090626/
8 我把刚才编译的vehicles整个目录copy到/var/www/下.
9 修改php.ini:
emacs /etc/php5/apache2/php.ini
在里面加入extension=vehicles, 并把 enable_dl设置为On
10 重启apache2
11 在浏览器里输入http://localhost/vehicles/vehicles.php出现以下错误:
Warning: dl() [function.dl]: vehicles: Unable to initialize module Module compiled with module API=20090626, debug=0, thread-safety=0 PHP compiled with module API=20060613, debug=0, thread-safety=0 These options need to match in /var/www/vehicles/vehicles.php on line 5
Functions available in the test extension:
Warning: Invalid argument supplied for foreach() in /var/www/vehicles/vehicles.php on line 10
Module vehicles is not compiled into PHP
网上找了很多资料都没说这个问题, 我该怎么解决? |
|