2012-03-08 17 views
0

ctypesを使用して、C++コード用のPythonラッパー(ここではCalling C/C++ from python? )を使用しています。しかし、問題はコードの主な機能です。私は私のC++のコードでPythonからint main()を呼び出す

  extern "C" { 
      void call_main(){ main();} 
     } 

ような何かを行うとすると、その後のpythonラッパーを経由してこの関数を呼び出す

  ... 
      lib = cdll.lib('./mylib.so') 
      def run(): 
       lib.call_main() 

- >私は "セグメンテーションフォールト" を取得します。

面白いのは、私の主なメソッドコードをコピーして、たとえば、という名前の関数にコピーするときです。 test()ので、C++コードでint test(){....#pasteed code ...}を実行してexternしてからlib.test()を呼び出します。

=> eveythingはうまくいきます。メイン関数がmainまたは何かと呼ばれる問題でなければなりません。

+0

Cコンパイラのような音はmain関数を特別な方法で扱います。 –

+1

main()を再帰的に呼び出すことはcで許可されていますが、C++では許可されていないと思いますので、コンパイラでは特別なことをすることができます。 – BoBTFish

答えて

2

C++では、再帰的に呼び出すことはできません(3.6.1、basic.start.main、パラグラフ3参照)。また、C++の機能を呼び出すときは、C++対応のエントリポイントが必要です。 C++の機能をこれを使わずに呼び出すことで時々逃げることができますが、うまくいくのは何か、そうでないのはまったく簡単なことではありません。明白な問題は、グローバルオブジェクトが初期化を必要とすることです。

呼び出すコードを別の関数に置き、これを呼び出します。

+0

ありがとう... "C++対応エントリポイント"の意味を教えてください。 – kosta5

+0

オペレーティングシステムは、さまざまな環境のニーズをほとんど気にしません。プログラムを起動するときに実行するのは、ある場所にジャンプして実行を開始することだけです。これは通常、起動オブジェクトからの記号(crt0.oなど)です。 yhisがC++について知らない場合、グローバルオブジェクトのコンストラクタは実行されません。 C++コンパイラを介してリンクするときはOKですが、C++のmain()を呼び出すため、これはできないようです。 –