【问题标题】:calling int main() from python从 python 调用 int main()
【发布时间】:2012-03-08 10:23:35
【问题描述】:

我有一个适用于 C++ 代码的 Python 包装器(如此处建议的 Calling C/C++ from python? ) 使用 ctypes。但问题在于代码的主要功能。当我做类似的事情时

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

在我的 c++ 代码中,然后通过 python wrapper 调用这个函数

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

-> 我得到“分段错误”。

有趣的是,当我将我的主要方法代码复制粘贴到名为例如的函数中时测试(所以它是 c++ 代码中的 int test() {....#pasted code...}),extern 它然后调用 lib.test()

=> 一切都很好......所以它一定是主函数被称为 main 或其他东西的问题

【问题讨论】:

  • 听起来你的 C 编译器以一种特殊的方式处理 main 函数。
  • 我相信在 c 中递归调用 main() 是(/是?)允许的,但在 c++ 中不允许,所以编译器可能被允许用它做一些特殊的事情。

标签: c++ python ctypes main


【解决方案1】:

在 C++ 中,不允许递归调用 main()(参见 3.6.1,basic.start.main,第 3 段)。此外,当您想要调用 C++ 功能时,您需要一个可识别 C++ 的入口点。有时你可以在没有这个的情况下调用 C++ 功能,但是什么会起作用,什么不是完全直截了当的。明显的问题是需要初始化的全局对象。

只需将您要调用的代码放入不同的函数并调用它即可。

【讨论】:

  • 谢谢...你能指出“c++ 感知入口点”是什么意思吗?
  • 操作系统几乎没有考虑不同环境的需求。它在启动程序时所做的只是跳转到某个地方并开始执行。这通常是来自启动对象的一些符号(例如 crt0.o)。例如,如果 yhis 不了解 C++,它将不会为全局对象运行构造函数。当通过 C++ 编译器链接时,你可以,但因为你想调用 C++ main(),所以你可能不会这样做。
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2021-06-29
  • 2013-11-04
  • 2012-08-26
相关资源
最近更新 更多