文档章节

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

苗雨顺
 苗雨顺
发布于 2012/05/31 00:04
字数 1025
阅读 285
收藏 5

近日发现了一个很有用的PHP扩展,它可以让PHP直接执行C代码,无需编译。

TCC(Tiny C Compiler)是一个C编译器,支持直接执行C源代码。

关于TCC的介绍这里不多说,可以从这里了解 http://www.ibm.com/developerworks/cn/linux/l-tinyc/part1/

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

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

一、安装TCC编译器

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

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

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

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

tar -zxvf f98c2306a0857ad3f8800f91e0554a27adc7f675.tar.gz

cd tinycc

./configure --prefix=/usr


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

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

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

vim Makefile

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

代码应该是

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

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

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

保存退出

make

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

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

yum install texi2html

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

make test
make install

二、安装PHP TCC 模块

直接使用pecl进行安装

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

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

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

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

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

Build process completed successfully
Installing '/usr/lib64/php/modules/tcc.so'
install ok: channel://pecl.php.net/tcc-0.1.2
configuration option "php_ini" is not set to php.ini location
You should add "extension=tcc.so" to php.ini

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

cc -shared  .libs/tcc.o  -ltcc  -Wl,-soname -Wl,tcc.so -o .libs/tcc.so
/usr/bin/ld: /usr/lib/libtcc.a(libtcc.o): relocation R_X86_64_32 against `a local symbol' 
can not be used when making a shared object; recompile with -fPIC
/usr/lib/libtcc.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [tcc.la] Error 1
ERROR: `make' failed

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

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

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

extension=tcc.so

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

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

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

php -m

检查是否有tcc一项

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

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

 三、测试扩展

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

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

<?php  
$buf = 'int main(){printf("hello world"); return 0;}';  
$tcc = tcc_new();  
$ret = tcc_compile_string($tcc, $buf);  $ret = tcc_run($tcc);
?>


上面代码会输出

hello world

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

<?php  
$tcc = tcc_new();  
$ret = tcc_add_file($tcc, 'hello.c');  
tcc_run($tcc);
?>


hello.c 内容

int main()
{
    printf("hello world\n");
    return 0;
}

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

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

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

© 著作权归作者所有

苗雨顺
粉丝 15
博文 31
码字总数 12536
作品 0
东城
程序员
私信 提问
解压即用,跨Linux发行版PHP7打包

PHP7 for Linux: https://downloads.php.net/~ab/ PHP7 for Windows: http://windows.php.net/downloads/qa/ 适用环境: 64位Linux: PHP在抗战胜利日 发布了PHP7 RC2. PHP-7.0.0-RC2 2015/09......

eechen
2015/05/06
12K
22
关于php扩展的tcc安装

@苗雨顺 你好,想跟你请教个问题: 大神,我把你的教程反复看了十来遍,怎么都装不成功,只好打扰你求指导了,抽空帮帮我吧! 我先是用centos x64 的6.3版本装的 安装tcc时,在make test 出现...

winds18
2012/10/26
156
1
pdo oci 连接oracle

环境 主机linux [devtac@test_1 ~]$ lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-......

tacg
2014/09/24
183
0
WDCP、AMH面板环境安装IonCube Loader扩展方法

如果我们使用VPS/服务器仅仅是为了简单的网站环境,直接使用WEB面板、一键安装包就可以很容易的搭建环境,但对于一些有特别定制程序需求的软件工具,可能会有需要各种基于VPS的组件扩展。比如...

刘语彤
2015/11/28
122
0
5月23日任务 LAMP架构介绍、MySQL、MariaDB介绍、 MySQL安装

11.1 LAMP架构 LAMP 是Linux、 Apache、 MySQL、 PHP的简写,其实就是把Apache、MySQL以及PHP安装在Linux系统上,组成一个环境来运行php的脚本语言。至于什么是php脚本语言,这边不介绍。Apa...

吕湘颖
2018/05/09
28
0

没有更多内容

加载失败,请刷新页面

加载更多

QML学习之浅谈Window

转载地址:http://blog.csdn.net/kanchuan1905/article/details/53762788 在Qt Quick的世界里,Window对象用于创建一个与操作系统相关的顶层窗口,包含了如Text, Rectangle, Image等元素。W...

shzwork
31分钟前
5
0
centos 查看删除旧内核

1、查看系统中安装的内核 $ yum list installed | grep kernel 2、删除系统中旧内核 $ yum install yum-utils$ package-cleanup --oldkernels --count=2...

编程老陆
今天
10
0
ES6

ES6:不改变原理的基础上,让API变得更简单 一、let:代替var用于声明变量 1、var的缺点: (1)声明提前 (2)没有块级作用域 2、let的优点: (1)组织了申明提前 (2)让let所在的块({}),...

wytao1995
今天
3
0
kubernetes 环境搭建 —— minikube

创建集群 minikube start 搭建好 k8s 集群后,可以查看集群的状态以及部署应用。主要用到的是 k8s 的 api,这通常需借助于 kutectl 命令行工具 基本操作 kubectl versionkubectl cluster-i...

lemos
今天
11
0
关于js混淆与反混淆还原操作

使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密,或者混淆js来达到代码保护。 1、为什么...

开源oschina
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部