c++中嵌入perl,python
昨日無意翻了下“黑豹書”(perl 進階程式設計),發現裡面的嵌入perl解釋器的那部分
内容已經過時了,寫下過程,關鍵點就是找到perl安裝路徑的lib/CORE
裡面有 perl58.lib 或perl.lib ,
還有就是頭檔案 EXTERN.h and perl.h 。
代碼為:interp.c(來自perldoc)
#include <EXTERN.h> /* from the Perl distribution */
#include <perl.h> /* from the Perl distribution */
static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
int main(int argc, char **argv, char **env)
{
PERL_SYS_INIT3(&argc,&argv,&env);
my_perl = perl_alloc();
perl_construct(my_perl);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
perl_parse(my_perl, NULL, argc, argv, (char **)NULL);
perl_run(my_perl);
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
}
編譯器如果是vc的話把 lib/CORE 路徑加上 裡面的include 和lib要設定
如果是gcc:
% gcc -O2 -Dbool=char -DHAS_BOOL -I/usr/local/include
-I/usr/local/lib/perl5/i586-linux/5.003/CORE
-L/usr/local/lib/perl5/i586-linux/5.003/CORE
-o interp interp.c -lperl -lm
win平台的把-I -L換成你的CORE路徑 -l 換成你的perl58=》對應perl58.lib
然後運作這個程式interp(interp.exe)就可以當perl解釋器用了。
% interp -e 'printf("%x", 3735928559)'
deadbeef
和
% interp
print "Pretty Good Perl /n";
print "10890 - 9801 is ", 10890 - 9801;
<CTRL-D>
Pretty Good Perl
10890 - 9801 is 1089
更進一步應用可以改紅色的兩行。
python的嵌入也是一樣 需要的python的頭檔案和lib
#include <Python.h> int main(int argc, char *argv[]) { Py_Initialize(); PyRun_SimpleString("from time import time,ctime/n" "print 'Today is',ctime(time())/n"); Py_Finalize(); return 0; } 編譯器參數安裝perl的來改;
python随帶的doc說的很清楚,另外boost裡面也有直接嵌入python的庫,需要編譯
bjam好辛苦。
嵌入解釋器的最典型的案例就是emacs,它嵌入了lisp解釋器,使之就如一個作業系統一樣
不止是擴充和定制這麼簡單。應用到自己的項目,就可以給使用者更多的友善,當然這就得
使用堆棧通路的進階特性了。
那c++ 和perl、python 兩個程式分離不也行麼?使用臨時檔案做媒體,或使用子程序
管道來取資料,但這樣的結果就是環境不連貫,關鍵性地方性能受限,換句話,不是因為性能
就隻用perl、python好了。是以嵌入還是有其優點的。