引用 加载动态库(.so) 文件

最后更新于:2022-04-02 02:32:40

[TOC] > [参考](http://www.bkjia.com/Linux/964805.html) ## 创建一个 .so 文件 ## 1. 创建`hello.c` ``` int hello_add(int a, int b) { return a + b; } ``` ## 2. 编译 ``` $ gcc -O -c -fPIC -o hello.o hello.c $ gcc -shared -o libhello.so hello.o $ su # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf # cp libhello.so /usr/local/lib # /sbin/ldconfig ``` ## 3. 验证是否正确加载 创建 `hellotest.c` ``` #include int main() { int a = 3, b = 4; printf("%d + %d = %d\n", a, b, hello_add(a,b)); return 0; } ``` 执行 ``` $ gcc -o hellotest -lhello hellotest.c # -lhello 编译时加入动态so 文件 $ ./hellotest 3 + 4 = 7 ``` > 在 CentOS 下可以正常编译 ## 4. 下载php 源码 进入`ext` ``` $ ./ext_skel --extname=hello $ cd hello ``` ## 5. 修改 `config.m4` `去掉第16行和第18行的注释(注释符号为 dnl )` ``` 16: PHP_ARG_ENABLE(hello, whether to enable hello support, 17: dnl Make sure that the comment is aligned: 18: [ --enable-hello Enable hello support]) ``` ``` $ phpize ``` ## 6. 修改` php_hello.h` 在文件后尾添加 ``` PHP_FUNCTION(hello_add); ``` ## 7. 编辑`hello.c` ``` zend_function_entry hello_functions[] = { PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */ PHP_FE(hello_add, NULL) /* 此处添加要实现的方法 */ {NULL, NULL, NULL} /* Must be the last line in hello_functions[] */ }; //文末,添加具体实现 PHP_FUNCTION(hello_add) { longint a, b; longint result; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) { return; } result = hello_add(a, b); RETURN_LONG(result); } ``` ## 8. 编译安装 ``` $ phpize $ ./configure --with-php-config=/www/server/php/56/bin/php-config $ make clean # 清除编译 $ make LDFLAGS=-lhello #-lhello 表示加载 动态库 libhello.so 文件 $ sudo make install ``` 在`php.ini`加入`extension=hello.so` ## 9. 测试 `php -r"echo hello_add(3, 4);"` //输出7 或者使用`php hello.php`
';