【发布时间】: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