在php扩展开发中如何使用pkg-config
程序员文章站
2022-04-13 13:48:29
...
首先科普下pkg-config能干啥。下面是*对pkg-config的说明:
pkg-config 是一个提供从源代码中编译软件时查询已安装的库时使用的统一接口的计算机软件。pkg-config原本是设计用于Linux的,但现在在各个版本的BSD、windows、Mac OS X和Solaris上都有着可用的版本。
简单的说,pkg-config主要提供如下几个功能:
pkg-config 是一个提供从源代码中编译软件时查询已安装的库时使用的统一接口的计算机软件。pkg-config原本是设计用于Linux的,但现在在各个版本的BSD、windows、Mac OS X和Solaris上都有着可用的版本。
简单的说,pkg-config主要提供如下几个功能:
1、检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
2、获得编译预处理参数,如宏定义,头文件的位置。
3、获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
4、自动加入所依赖的其它库的设置。
最近开发一个用于图片裁剪的php扩展用到了opencv。opencv需要加载的so库很多,手动加入到config.m4中,太麻烦,而且也不利用后期维护。幸好opencv提供了opencv.pc文件,这样就可以使用pkg-config自动获取编译的参数。
下面是我在config.m4中写的自动加载opencv相关so库和头文件的代码。
dnl # --with-tclip -> check with-path SEARCH_PATH="/usr/lib/pkgconfig" # 定义pkgconfig文件,即扩展名pc文件存放路径 SEARCH_FOR="opencv.pc" # 要寻找的文件 if test -r $PHP_TCLIP/$SEARCH_FOR; then # TCLIP_DIR=$PHP_TCLIP else # search default path list AC_MSG_CHECKING([for tclip files in default path]) for i in $SEARCH_PATH ; do if test -r $i/$SEARCH_FOR; then TCLIP_DIR=$i AC_MSG_RESULT(found in $i) fi done fi dnl if test -z "$TCLIP_DIR"; then AC_MSG_RESULT([not found]) AC_MSG_ERROR([Please reinstall the tclip distribution]) fi OPENCV_FLAGS="`pkg-config opencv --libs --cflags opencv`" for i in $OPENCV_FLAGS;do if test ${i:0:2} = "-I" ;then PHP_ADD_INCLUDE(${i:2}) elif test ${i:${#i}-3} = ".so" ;then dir_name=`dirname $i` file_name=${i/$dir_name/} file_name=${file_name/\/lib/} file_name=${file_name/.so/} PHP_ADD_LIBRARY_WITH_PATH($file_name,$dir_name,TCLIP_SHARED_LIBADD) fi done
注意:
if的条件部分请不要用大括号的方式,否则m4生成的makefile文件中会有语法错误。
参考文档
http://www.chenjunlu.com/2011/03/understanding-pkg-config-tool/ 《理解 pkg-config 工具》
http://www.php.net/manual/zh/internals2.buildsys.configunix.php 《与 UNIX 构建系统交互: config.m4》
推荐阅读
-
php在linux环境中如何使用redis详解
-
在AIX Version 5.3中使用Java和PHP技术进行开发,第1部分:设置Java环境_PHP教程
-
在AIX Version 5.3中使用Java和PHP技术进行开发,第1部分:设置Java环境
-
在一个未知的CentOS服务器中如何加上PHP的openssl扩展_PHP教程
-
在php中如何使用com(仅适合windows系统)
-
在php中如何使用com(仅适合windows系统)
-
使用xhprof在开发环境中测试php性能
-
在php中使用swoole扩展时,server端的回调函数中如何使用thinkphp框架的方法?
-
在PHP中如何使用RabbitMQ来实现消息的订阅和发布?
-
php扩展开发 - PHP使用C语言开发扩展中:zend_parse_parameters方法接收二进制数据时取不到数据?