感谢支持
我们一直在努力

64位Linux环境安装PHP TCC 扩展方法

近日发现了一个很有用的PHP扩展,它可以让PHP直接执行C代码,无需编译。TCC(Tiny C Compiler)是一个C编译器,支持直接执行C源代码。


关于TCC的介绍这里不多说,刚开始在32位Ubuntu下安装,很顺利就装了,不过在64位CentOS上安装时却遇到很多错误,花了差不多半天的时间终于搞定了。


下面详细讲一下我在64们CentOS上安装tcc 的 php扩展中遇到的问题以及解决办法


一、安装TCC编译器


从官网 http://bellard.org/tcc/ 下载源码,编译安装。


注意不要直接从官网那里下载源码,那里的代码在make编译完,执行make test 时会报错,如下:


  1.  ———— test3 ————  

  2. ../tcc -B.. -DTCC_TARGET_X86_64 -run ../tcc.c -B.. -DTCC_TARGET_X86_64 -run ../tcc.c -B.. -DTCC_TARGET_X86_64 -run ../tcc.c -B.. -run tcctest.c > test.out3  

  3. tcc: undefined symbol ‘alloca’  

  4. make[1]: *** [test3] Error 255  

需要直接从版本库中下载已经修复此错误的版本,可以下载最新的


  1. wget http://repo.or.cz/w/tinycc.git/snapshot/f98c2306a0857ad3f8800f91e0554a27adc7f675.tar.gz  

  2.   

  3. tar -zxvf f98c2306a0857ad3f8800f91e0554a27adc7f675.tar.gz  

  4.   

  5. cd tinycc  

  6.   

  7. ./configure –prefix=/usr  

版本库地址 http://repo.or.cz/w/tinycc.git


我下载的文件是2012-04-18日提交的版本,命令如下:


 下面我们要编辑一下Makefile文件,不然后面安装php_tcc模块时编译会无法通过


  1. vim Makefile  

找到 ”libtcc.a: $(LIBTCC_OBJ)“ 所在行的上一行


代码应该是


  1. $(CC) -o $@ -c $< $(NATIVE_DEFINES) $(CFLAGS)  



将这一行的最后加上 “-fPIC”,即改为


  1. $(CC) -o $@ -c $< $(NATIVE_DEFINES) $(CFLAGS) -fPIC  



保存退出


  1. make  




中间可能会报 make: texi2html: Command not found


这个是生成html帮助文档的,可以忽略,需要的话可以先 texi2html 然后重新make


  1. yum install texi2html  



没有make错误就继续执行下面命令


  1. make test  

  2. make install  

二、安装PHP TCC 模块


直接使用pecl进行安装


如果没有安装pecl 可以先使用 yum install php-pear 进行安装


  1. pecl install tcc  



会出现如下提示


Failed to download pecl/tcc within preferred state “stable”, latest release is version 0.1.2, stability “devel”, use “channel://pecl.php.net/tcc-0.1.2” to install


意思就是说现在没有稳定版本,只提供开发版,需要手动指定网址进行下载


  1. pecl install channel://pecl.php.net/tcc-0.1.2  



安装正确的话会有如下不提示


  1. Build process completed successfully  

  2. Installing ‘/usr/lib64/php/modules/tcc.so’  

  3. install ok: channel://pecl.php.net/tcc-0.1.2  

  4. configuration option “php_ini” is not set to php.ini location  

  5. You should add “extension=tcc.so” to php.ini  



如果make时报了如下错误,请返回第一步,确认是否加了”-fPIC“编译参数,并且加的位置正确


  1. cc -shared  .libs/tcc.o  -ltcc  -Wl,-soname -Wl,tcc.so -o .libs/tcc.so  

  2. /usr/bin/ld: /usr/lib/libtcc.a(libtcc.o): relocation R_X86_64_32 against   

  3. `a local symbol’ can not be used when making a shared object;   

  4. recompile with -fPIC  

  5. /usr/lib/libtcc.a: could not read symbols: Bad value  

  6. collect2: ld returned 1 exit status  

  7. make: *** [tcc.la] Error 1  

  8. ERROR: `make’ failed  



如果没有错误,继续执行下面操作


这时只要在php.ini中添加一行扩展加载项就可以了


位置任意,不过最好还是跟其他extension放在一起,方便管理


  1.       

  2. extension=tcc.so  



也有可能你的扩展加载不在php.ini中配置,而是/etc/php.d/下面的单独文件来配置,这种情况你只在这个目录新建个文件,如tcc.ini


内容就是上面那一行,保存即可。


然后检查扩展是否已经加载成功


  1.       

  2. php -m  




检查是否有tcc一项


有的话就大功告成,扩展已经正确安装


注:如果你是在浏览器下使用phpinfo()测试,请记得先重启webserver,这样对php.ini的修改才能正式生效

三、测试扩展 


PHP代码里直接执行C代码字符串的例子


保存如下文件,并在命令行下执行


  1. <?php    

  2. $buf = ‘int main(){printf(“hello world”); return 0;}’;    

  3. $tcc = tcc_new();    

  4. $ret = tcc_compile_string($tcc$buf);  $ret = tcc_run($tcc);  

  5. ?>  

上面代码会输出


hello world 


PHP代码里直接执行C源文件的例子


  1. <?php    

  2. $tcc = tcc_new();    

  3. $ret = tcc_add_file($tcc‘hello.c’);    

  4. tcc_run($tcc);  

  5. ?>  

hello.c 内容


  1. int main()  

  2. {  

  3.     printf(“hello world\n”);  

  4.     return 0;  

  5. }  





注:如果hello.c 有包含头文件如 #include <stdio.h>,执行时会报错


还没有仔细研究,可以下载源码,里面的tests目录下有一些示例


  1. pecl download channel://pecl.php.net/tcc-0.1.2  

赞(0) 打赏
转载请注明出处:服务器评测 » 64位Linux环境安装PHP TCC 扩展方法
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏