2012-03-08 75 views
0

我对C++代码的工作Python包装(如这里Calling C/C++ from python? 建议)使用ctypes的。但问题是代码的主要功能。当我这样做调用INT主要()从蟒蛇

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

在我的C++代码,然后通过Python包装调用这个函数

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

- >我得到 “段错误”。

有趣的是,当我复制粘贴我的主要方法的代码到函数例如所谓的测试(所以它在C++代码INT测试(){....#粘贴代码...}),它的extern,然后调用lib.test()

=>和eveything工作正常...所以它必须是主函数被称为main或

+0

听起来像你的C编译器以特殊的方式处理主函数。 – 2012-03-08 10:37:20

+1

我相信在c中允许(/是?)递归调用main(),但不允许C++,因此编译器可能被允许对它做一些特殊的事情。 – BoBTFish 2012-03-08 10:53:12

回答

2

的问题在C++调用main()递归不允许(见3.6.1,basic.start.main,第3段)。另外,当你想调用C++功能时,你需要一个C++的入口点。有时你可以不用调用C++的功能,但是什么是工作,什么不工作并不是完全简单的。显而易见的问题是全局对象需要初始化。

只要把你想调用到不同的功能,并调用此代码。

+0

谢谢...你能指点我“C++意识到的入口点”是什么意思吗? – kosta5 2012-03-09 07:12:58

+0

操作系统几乎没有注意到不同环境的需求。所有它在启动程序时都会跳到某个地方并开始执行。这通常是来自启动对象的一些符号(例如crt0.o)。例如,如果yhis不知道C++,它将不会运行全局对象的构造函数。当通过C++编译器连接时,你可以,但是因为你想调用C++ main(),所以你可能不会这样做。 – 2012-03-09 11:32:30