チョー久しぶりにCでプログラムを書いているんですが、こんなに面倒くさい言語だったっけ・・・。ブランクが長すぎるので、ポインタを扱うときに、思考停止します(´д`)。
作っているのはMPEG編集ライブラリを呼び出すAPIなんですが、最終的にPHPから呼び出す必要があるので、PHPの拡張モジュールにしてみる。
ということで、PEAR::CodeGen_PECLを使ってextensionのひな形を生成。
■前準備
PHP環境ははXAMPP for linuxを使っているので、xampp-linux-devel-1.6.8a.tar.gzをインストール。
codegen_peclをインストール
# /opt/lampp/bin/pear install -alldeps codegen_pecl
# /opt/lampp/bin/pecl-gen –version
yumでm4、autoconf、automake、libtoolをインストール。
まずはspecファイルから記述
[mpegedit.xml]
<?xml version="1.0" encoding="UTF-8"?>
<extension name="mpegedit" version="1.0.0">
<summary>MPEG API</summary>
<description>MPEG API PHP extension module.</description>
<license>PHP</license>
<channel>__uri</channel>
<release>
<version>1.0.0</version>
<date>2008-10-25</date>
<state>stable</state>
<notes><?data
– first release.
?></notes>
</release>
<deps language="c" platform="all">
<with name="mpegedit" defaults="/usr:/usr/local" testfile="include/mpeg_lib.h">
<header name="mpeg_lib.h"/>
<header name="mpeg_error.h"/>
<lib name="mpeglib" platform="all"/>
<lib name="mpcommon" platform="all"/>
<lib name="mpsysmux" platform="all"/>
<lib name="mpedit" platform="all"/>
<lib name="mp4system" platform="all"/>
<lib name="mp4video" platform="all"/>
<lib name="mp4audio" platform="all"/>
<lib name="mpvideo" platform="all"/>
<lib name="mpaudio" platform="all"/>
<lib name="mp1system" platform="all"/>
<lib name="mp2system" platform="all"/>
<lib name="mpalib" platform="all"/>
<lib name="mpvlib" platform="all"/>
<lib name="jpeglib" platform="all"/>
<lib name="mpformat" platform="all"/>
<lib name="mpbuff" platform="all"/>
<lib name="mptime" platform="all"/>
<lib name="mpferror" platform="all"/>
<lib name="mpfprotect" platform="all"/>
</with>
<with name="icc" default="/usr:/usr/local" testfile="include/limits.h">
<header name="limits.h"/>
<lib name="cprts" platform="all"/>
<lib name="irc" platform="all"/>
<lib name="cxa" platform="all"/>
<lib name="unwind" platform="all"/>
</with>
</deps>
<function name="mpeg_frame_edit_match" role="public">
<proto>int mpeg_frame_edit_match(string filename, string pid)</proto>
<summary>MPEGFrameEditMatchSrc</summary>
<description>MPEGFrameEditMatchSrc</description>
<test>
<code><?data
echo mpeg_frame_edit_match("test.mpg", "****************");
?></code>
<result mode="format">0</result>
</test>
</function>
<function name="mpeg_gop_edit_match" role="public">
<proto>int mpeg_gop_edit_match(string filename, string pid)</proto>
<summary>MPEGGOPEditMatchSrc</summary>
<description><?data
MPEGGOPEditMatchSrc
?></description>
<test>
<code><?data
echo mpeg_gop_edit_match("test.mpg", "****************");
?></code>
<result mode="format">0</result>
</test>
</function>
<function name="mpeg_gop_edit" role="public">
<proto>int mpeg_gop_edit(string src, string dest, string param, string pid)</proto>
<summary>MPEGGOPEditStreams</summary>
<description>MPEGGOPEditStreams</description>
<test>
<code><?data
echo mpeg_gop_edit("test.mpg", "test2.mpg", "-en all", "****************");
?></code>
<result mode="format">0</result>
</test>
</function>
</extension>
$ pecl-gen mpegedit.xml
$ cd mpegedit
$ phpize
$ ./configure –enable-mpegedit –with-mpegedit=../MpegLib –with-icc=/opt/intel/cc/9.1.053 CC=”icc” CFLAGS=”-Wall -O3 -cxxlib-icc -no-gcc”
$ make
$ make test
こんな感じでビルドしてみたんですが、NG・・・。undefined referenceの嵐。
使用するMPEG編集ライブラリが、かなり古いもの(タイムスタンプが2003年とか)で、かつIntelのライブラリを使用しているためIntel C/C++ Compilerで-cxxlib-iccオプションを付けないといけないようで、-cxxlib-iccオプションの使える最終バージョンの9.1.053を使用。
結局specファイルのdepsを全部削除して
$ pecl-gen mpegedit.xml
$ cd mpegedit
$ phpize
$ ./configure –enable-mpegedit
と、やってMakefileを作成した後で、Makefileを直接編集して、コンパイルだけiccを使うようにしてみた。
[Makefile変更箇所抜粋]
MPEGEDIT_SHARED_LIBADD = -L../MpegLib/lib ¥
-lmpeglib -lmpcommon -lmpsysmux -lmpedit -lmp4system ¥
-lmp4video -lmp4audio -lmpvideo -lmpaudio -lmp1system ¥
-lmp2system -lmpalib -lmpvlib -ljpeglib -lmpformat ¥
-lmpbuff -lmptime -lmpferror -lmpfprotect ¥
-L/opt/intel/cc/9.1.053/lib -lcprts -lcxa -lunwind -lirc
CC = icc
CFLAGS = -Wall -cxxlib-icc -no-gcc -I../MpegLib/include -I/opt/intel/cc/9.1.053/include
$ make
$ make test
undefined reference to ‘__gxx_personality_v0’エラー(´・ω・`)
MakefileのEXTRA_LIBSに”-lstdc++”を追加
$ make
$ make test
動いた(´д`)。


コメント