2012年9月12日 星期三

swig產生poppler的perl介面步驟(一)

剛看了一下,apt-get install下來的 libpoppler19 和對應的原碼 libpoppler-dev 版本竟然不同,後者為0.18版。不過暫且放下這個問題,等到要編譯時再說。

產生 i 檔如下, 命名為 popplerIntf.i
%module popplerIntf
%{
#include "/usr/include/poppler/PDFDoc.h"
%}
%include "/usr/include/poppler/PDFDoc.h"
然後下swig指令
swig -c++ -perl5 popplerIntf.i

看起來是成功了。不過問題才剛開始,下一步編譯和連結,必需要確定版本的一致性,因此還是從官網直接抓最新的 source 下來編譯比較保險。可參考http://linux.vbird.org/linux_basic/0520source_code_and_tarball.php
  • poppler 似乎同時維護兩種 build systems,分別是 CMake 和 autotools (automaker等) ,參見 http://blogs.gentoo.org/lu_zero/2010/01/24/cmake-vs-autotools-poppler/ 。
    • autotools 的使用可參考 http://riverhippo.blogspot.tw/2010/03/gnu-autotools-share-library.html ,其腳本似乎為根目錄下的autogen.sh
    • CMake 的組態檔取名為 CmakeLists.txt ,參見 http://zh.wikipedia.org/wiki/CMake
  • 根目錄的 INSTALL 檔案說明了一些基本的安裝方式,但沒看到configure檔,顯然我們需要執行 aclocal, autoconf, automake,參見 http://blog.roodo.com/rocksaying/archives/12687975.html
  • 但以上功能已由 autorecon 取代,被寫在 autogen.sh 中,因此整個組建流程簡化為:
  1. 建立並進入子目錄(先確認 <程式庫安裝完整目錄> 已建)
  2. 執行 ../autogen.sh --prefix=<程式庫安裝完整目錄>
  3. make
  4. make install
其實以我們現在的情況是要寫module的話,安裝目錄不指定可能反而比較方便封裝
根據 swig-2.0.8/Doc/Manual/Perl5.html#Perl5_nn9 ,編譯 *_wrap.cxx 檔:
g++ -fPIC -c popplerIntf_wrap.cxx -I/usr/lib/perl/5.14/CORE -I./poppler-0.20.3 -I./poppler-0.20.3/mydist/poppler
g++ -shared popplerIntf_wrap.o -L/home/sig/usr/local/lib -lpoppler-cpp -o popplerIntf.so
最後測試一下
perl -MpopplerIntf -e 'print "hi\n"'
但問題還是出現了
perl -e 'use popplerIntf;$doc=new popplerIntf::PDFDoc("a.pdf");'
訊息如下:
No matching function for overloaded 'new_PDFDoc' at popplerIntf.pm line 62.

根據此文的暗示,可能要自己寫 typemaps...

沒有留言:

張貼留言