PythonとCは相互に呼び出し、コンパイルします.

6445 ワード

最近Boostを勉強しています.pythonのために、違う言語の間の相互コンパイルを試してみたいです.
参考資料:http://blog.csdn.net/joliny/article/details/2457197.
 
驚いたことに、パソコンにpyton t 2.7とvs 2010がインストールされていますが、他のAPIやコンパイラをインストールする必要がなく、直接にcプログラムでPythonを呼び出すことができます.
まず試したのはVS IDEでコンパイルしましたが、ネットでインストールされているpythonはrelease版で、コンパイルにはいつも問題があります.だからまた第二の方法に変えて、dos命令の下で.
最初の方法は大丈夫だと思いますが、時間がないので、続けられませんでした.後で時間があれば試してみたいです.
 
知識の準備
1.Dosでコンパイルコマンドclパラメータ詳細
                          C/C++      



                              -  -



/O1                                /Op[-]         

/O2                                /Os       

/Oa                               /Ot       

/Ob<n>     (   n=0)               /Ow         

/Od     (   )                    /Ox      。(/Ogityb2 /Gs)

/Og                               /Oy[-]         

/Oi       



                             -    -



/G3   80386                        /Gh    _penter     

/G4   80486                        /GH    _pexit     

/G5   Pentium                      /GR[-]    C++ RTTI

/G6   PPro、P-II、P-III            /GX[-]    C++ EH (  /EHsc   )

/G7   Pentium 4   Athlon          /EHs    C++ EH (   SEH   )

/GB          (  )            /EHa    C++ EH(w/ SEH   )

/Gd __cdecl                         /EHc extern "C"     nothrow

/Gr __fastcall                      /GT        TLS   

/Gz __stdcall                       /Gm[-]         

/GA   Windows                  /GL[-]          

/Gf                               /QIfdiv[-]    Pentium FDIV   

/GF                             /QI0f[-]    Pentium 0x0f   

/Gy                              /QIfist[-]    FIST     ftol()

/GZ       (/RTCs)                 /RTC1       (/RTCsu)

/Ge                          /RTCc           

/Gs[num]                        /RTCs         

/GS                               /RTCu            

/clr[:noAssembly]           

    noAssembly -       

/arch:<SSE|SSE2> CPU        ,      :

    SSE -      SSE   CPU      

    SSE2 -      SSE2   CPU      



                              -    -



/Fa[file]                      /Fo<file>       

/FA[sc]                          /Fp<file>         

/Fd[file]    .PDB                   /Fr[file]         

/Fe<file>                        /FR[file]      .SBR   

/Fm[file]       



                              -    -



/AI<dir>                      /Fx            

/FU<file>        /             /FI<file>         

/C                                 /U<name>       

/D<name>{=|#}<text>                  /u         

/E      stdout                      /I<dir>          

/EP      stdout,   #line         /X   “    ”

/P       



                                -  -



/Zi                               /Ze     (  )

/ZI   “     ”              /Zl    .OBJ       

/Z7                             /Zg       

/Zd                             /Zs        

/Zp[n]   n                    /vd{0|1}   /   vtordisp

/Za     (   /Op)                  /vm<x>          

/Zc:arg1[,arg2] C++      ,        :

    forScope -             C++ 

    wchar_t - wchar_t      ,   typedef



                              -    -



@<file>                           /wo<n>        n 

/?, /help                        /w<l><n>   n        1-4

/c    ,                          /W<n>       (   n=1)

/H<num>                         /Wall       

/J    char     unsigned            /Wp64    64        

/nologo                         /WX        

/showIncludes                    /WL       

/Tc<source file>        .c        /Yc[file]    .PCH   

/Tp<source file>        .cpp      /Yd           .OBJ  

/TC          .c                 /Yl[sym]        .PCH   

/TP          .cpp               /Yu[file]    .PCH   

/V<string>                       /YX[file]    .PCH

/w                                /Y-      PCH   

/wd<n>      n                       /Zm<n>       (    %)

/we<n>     n     



                                 -  -



/MD   MSVCRT.LIB                     /MDd   MSVCRTD.LIB      

/ML   LIBC.LIB                       /MLd   LIBCD.LIB      

/MT   LIBCMT.LIB                     /MTd   LIBCMTD.LIB      

/LD    .DLL                           /F<num>       

/LDd    .DLL                       /link [       ]

2.VSL 2010でコンパイル、dll実験の呼び出し
 
 一、Cプログラムでpythonを呼び出します.
まず、環境変数にpythonを追加するパスが必要です.これは通常のシステム環境変数パスに追加されています.(試してみましたが、失敗しました.パスの下にデフォルトで追加されたのは全部bin実行プログラムですか?)とは違います.
システム環境変数には2つの変数INCLUDEとLIBが追加され、それぞれpythonディレクトリ下のincludeとlibsに対応しています.
その後、プログラムをテストします.
#include <Python.h>



int main(int argc, char *argv[])



{



Py_Initialize();



PyRun_SimpleString("from time import time,ctime 
" "print 'Today is',ctime(time())
"); Py_Finalize(); return 0; }
 vs 2010 dosウィンドウで実行:cl foo.cはターゲットファイル表示でpython timeライブラリを呼び出した結果を生成することができます.
 
二、C言語を利用してPythonダイナミックリンクを生成する.
前にVS IDEでdllファイルを作成しましたが、今度はdosウィンドウの下でテストしました.
ファイルfoo.
 
#include <Python.h>



/* Define the method table. */



static PyObject *foo_bar(PyObject *self, PyObject *args);



static PyMethodDef FooMethods[] = {



{"bar",  foo_bar, METH_VARARGS},



{NULL, NULL}



};



/* Here's the initialization function.  We don't need to do anything



for our own needs, but Python needs that method table. */



void initfoo()



{



(void) Py_InitModule("foo", FooMethods);



}



/* Finally, let's do something ... involved ... as an example function. */



static PyObject *foo_bar(PyObject *self, PyObject *args)



{



char *string;



int   len;



if (!PyArg_ParseTuple(args, "s", &string))



return NULL;



len = strlen(string);



return Py_BuildValue("i", len);



}

 ファイルのfoo.defを定義します.
EXPORTS



initfoo

 以下のように実行します
E:\tmp>cl -c foo.c

Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64

Copyright (C) Microsoft Corporation.  All rights reserved.



foo.c





E:\tmp>link foo.obj /dll /def:foo.def /out:foo.dll

Microsoft (R) Incremental Linker Version 10.00.30319.01

Copyright (C) Microsoft Corporation.  All rights reserved.



         foo.lib     foo.exp

 
三、次はBoost.Pythonに連絡する実験です.