【问题标题】:Issue in Compling C++ method in Eclipse and calling C++ method from python在 Eclipse 中编译 C++ 方法并从 python 调用 C++ 方法中的问题
【发布时间】:2015-11-27 07:12:18
【问题描述】:

我想在一个名为 foo.cpp 的文件中讨论的简单 C++ 示例类

#include <iostream>

由于 ctypes 只能与 C 函数对话,因此您需要提供那些将它们声明为 extern "C" 的函数

extern "C" {
    Foo* Foo_new(){ return new Foo(); }
    void Foo_bar(Foo* foo){ foo->bar(); }
}

class Foo{
    public:
        void bar(){
            std::cout << "Hello" << std::endl;
        }
};

将其编译为共享库

g++ -c -fPIC foo.cpp -o foo.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so  foo.o

我终于写好了python wrapper

从 ctypes 导入 cdll lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
      def __init__(self):
          self.obj = lib.Foo_new()

      def bar(self):
          lib.Foo_bar(self.obj)
f = Foo()
f.bar() #prints "Hello" on the screen

“我的主要意图是在eclipse中编译C++代码并在Linux中从python调用C++函数”。当我在 Linux 中编译 C++ 代码并在 Linux 中从 python 调用 C++ 方法时,这工作正常。但如果我在 eclipse 中编译 C++ 代码并在 Linux 中从 python 调用 C++ 方法,它就不起作用。

Error message:

symbol not found

我是 Eclipse 工具链的新手,但我提供了编译器选项和链接选项,如下所示
g++ -c -fPIC foo.cpp -o foo.o g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

Eclipse 编译器选项和链接选项的快照将不胜感激。请帮我解决这个问题。提前致谢

【问题讨论】:

  • 它没有说缺少哪个符号?你在哪一行得到错误? f = Foo() 行,还是 f.bar() 行?
  • 可能有点跑题了:如果你想从 Python 调用 C++ 函数,你可以看看 SWIG (swig.org)。正确设置后,您可以从头文件中自动生成 Python-Wrapper。
  • 您能从上面的问题陈述中解释一下我是如何做到的吗?我担心我想从 eclipse 编译 c++ 代码。

标签: python c++ linux eclipse shared-objects


【解决方案1】:

您需要在 Eclipse 中创建两个项目。

  1. 使用现有代码的 Makefile 项目。 (File->New->Makefile project with existing code)。在这个项目中,您必须指向您的 foo.cpp 文件。然后在项目文件夹中,您必须创建名称为“Makefile”的文件。 Makefile 必须包含以下行:

    全部:

    g++ -c -fPIC foo.cpp -o foo.o

    g++ -shared -W1,-soname,libfoo.so -o libfoo.so foo.o

    干净:

    rm -f libfoo.so

然后您必须在“Make Target”窗口中为此项目创建规则(“all”和“clean”)。如果您没有看到此窗口,您必须执行 Window->Show view->Make Target。因此,当双击“Make target”视图中的“all”规则时,您可以使用 Eclipse 创建 libfoo.so 文件。

  1. 此时您可以使用 foo.py 文件创建 PyDev 项目。如果你不了解 PyDev,你必须去this site。它是 Python 语言的 Eclipse 插件。当您安装此插件时,您将可以在 Eclipse 下使用您的 python 文件。

看一些图片。

【讨论】:

  • 能否请您告诉我需要安装哪个编译器以及如何选择它?
  • 错误:在 PATH cppDev 中找不到程序“make”,您能帮我解决这个问题吗?
  • 您使用的 Linux 版本是什么????。您需要安装“make”实用程序。如果您有 apt-get 实用程序,则需要在控制台中输入“ apt-get install make ”。我的编译器版本稍后会告诉你。
  • 非常感谢!!我遇到了其他问题。 中的文件“cppPython.py”,第 2 行 lib = cdll.LoadLibrary('libfoo.so') 文件“/usr/lib64/python2.6/ctypes/__init__.py”,第 431 行,在 LoadLibrary 中返回self._dlltype(name) File "/usr/lib64/python2.6/ctypes/__init__.py", line 353, in init self._handle = _dlopen(self._name, mode) OSError: libfoo.so:错误的 ELF 类:ELFCLASS32。请帮我解决这个问题。我将在明天结束前添加 50 多个。提前致谢
  • @Sandy ..........您需要将目标文件编译为 64 位和位置无关,然后将目标文件链接到具有 64 位选项的共享库... ..................... g++ -c -fPIC -m64 foo.cpp -o foo.o g++ -m64 -shared -Wl,-soname,libfoo.so - o libfoo.so foo.o
猜你喜欢
  • 2011-08-20
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多