php扩展中使用动态链接库

整理下大概知识点:

  • C的编译、链接、安装过程
  • autoconf基本语法
  • config.m4中的PHP_XX系列宏(在aclocal.m4中)

具体例子:
以使用taglib(https://github.com/taglib/taglib)编写一个操作mp3的id3标签的PHP扩展为例,按照默认编译安装taglib,头文件在/usr/local/include/taglib/tag_c.h,共享库文件在/usr/local/lib/libtag_c.so
我用到了taglib这个库的c语言版,安装后taglib-config –libs命令得到的是它的c++版的库,所以要在config.m4里自己写。

config.m4的关键代码:

PHP_ARG_WITH(taglib, for taglib support, [  --with-taglib             Include taglib support])

if test "$PHP_TAGLIB" != "no"; then

SEARCH_PATH="/usr/local /usr"
SEARCH_FOR="/include/taglib/tag_c.h"
if test -r $PHP_TAGLIB/$SEARCH_FOR; then # path given as parameter
TAGLIB_DIR=$PHP_TAGLIB
else # search default path list
AC_MSG_CHECKING([for taglib files in default path])
for i in $SEARCH_PATH ; do
if test -r $i/$SEARCH_FOR; then
TAGLIB_DIR=$i
AC_MSG_RESULT(found in $i)
fi
done
fi

if test -z "$TAGLIB_DIR"; then
AC_MSG_RESULT([not found])
AC_MSG_ERROR([Please reinstall the taglib distribution])
fi

PHP_ADD_INCLUDE($TAGLIB_DIR/include)

dnl #库文件 libtag_c.so
LIBNAME=tag_c

dnl #库函数
LIBSYMBOL=taglib_file_tag

dnl 第三个参数要设置成EXTRA_LDFLAGS时,链接的时候才会加上 -ltag_c 参数...这个PHP_ADD_LIBRARY_WITH_PATH的原型还没看明白...
dnl 貌似还有好几种解决方案,PHP_EVAL_LIBLINE?
PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $TAGLIB_DIR/lib, EXTRA_LDFLAGS)

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
[
AC_DEFINE(HAVE_TAGLIB,1,[ ])
],[
AC_MSG_ERROR()
],[
-L$TAGLIB_DIR/lib -lm
])

PHP_NEW_EXTENSION(php_taglib, php_taglib.c, $ext_shared)
PHP_SUBST(TAGLIB_SHARED_LIBADD)
fi

接下来是

configure [--with-taglib[=/path]]
make
make install

顺利的话可以到php.ini里面加载扩展。

期间可能会出现tag_c.h文件找不到的问题,注意下头文件的路径是由 config.m4 文件里的 PHP_ADD_INCLUDE($TAGLIB_DIR/include) 加上 扩展源码里 #include “taglib/tag_c.h” 组成的。

然后,即使扩展编译安装成功,php_info()里看到加载成功,但是cli执行php 扩展测试代码的时候出现 symbol lookup error的话,应该是扩展链接的时候没有找到libtag_c.so, 注意下PHP_ADD_LIBRARY_WITH_PATH() 的第三个参数即可。

观片一部《暮光之城:破晓下》

很久很久没有写电影日志了。
电影字幕的最后说,‘以本系列电影的终篇,纪念逝去五年的时光’,从大二第一次看暮光系列,到今天,原来五年就这样过去了。
记得一开始看的时候,对电影里面很多新鲜的东西都着迷不已:Kristen Stewart迷人内敛的神态、吸血家族的各种特异功能、狼人的威猛、校园的各种小说般的故事…,接下来,却不知是因为年龄还是因为其他的什么,对中间的几部感觉都不那么好,然后,到了今天看最后一部,心情却如此的难以平静。五年的时间,逝去的绝对不仅仅是时间啊:很多很多的人,或许这辈子都不会再见到!很多很多的事,或许只能在回忆里发生了!很多很多的机会,或许我只能感叹了!
我不知道是不是以后人生的每个五年都能有如此多的回忆。但我肯定以后再也不会有如此轻松且兼带酸涩和甜蜜的感觉了。我们会渐渐的被残酷的现实浸泡得麻木。
电影的最后,Bella发现可以利用自己的能力对Edward去掉自己所有的防护,然后说了句:Now You know, nobody has ever loved andybody as much as I love you. 原来,最爱一个人并不需要什么,而是对他无条件的放下所有的防备担心忧虑…
以此简单的文字纪念逝去的大学四年,I miss the times, and the guys…

观片一部《天注定》

我可以感受我的思想和我的灵魂正在一点一点的死去。
面对生活里的种种,我变得越来越“正常”。我会因为想到没钱而感到压力巨大,会因为想到利益关系去和别人打交道,会因为被别人疏远而感到害怕。我就像一匹渐渐被生活驯服的野马,灵魂也慢慢的因为肉体的妥协而屈服。我再也找不回思维由兴而歌,灵魂随风起舞的感觉。
瞬时间,仿佛一切都已天注定。
几年来,职业的道路上我一直在为充实自己而努力,尽管我选择了自己喜欢的职业,但我却忽略了人生中其它重要的东西,比如亲人,比如朋友,比如爱。很多时候,我很容易被一篇技术文章刺激到满身动力和理想,而对生活中的很多的感动却麻木了。我很少打电话和朋友甚至亲人聊天,因为我不知道该说些什么,因为我还没学会关心。我很少对别人敞开心腹,因为我一直以为别人会知道的,因为我一直不知道怎样接受别人。
贾樟柯的这部电影是如此的平淡,让我感到只不过是把真实的生活稍加剪辑而已。但是它居然真实的就像你身边的故事,甚至就是某一部分的你的写照。生活在这样一个时代,当我们的坚持不被正视,当我们的灵魂被逼出卖,当我们的梦想逐渐模糊,如果在再不去感动,再不去珍惜,再不去爱,我怕惭愧也洗不清我们的罪恶、弥补不了我们的遗憾。