1

我正在尝试将Python脚本与C++脚本链接起来。我找到了这个并且有效。

foo.cpp

#include <iostream>

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

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

fooWrapper.py

from ctypes import 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()

要编译我使用:

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

如果-soname不起作用,请使用-install_name

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

并执行:
python fooWrapper.py

这行得通,它打印我“测试!” 的bar()功能。
问题是现在我想将一些参数从Python函数发送到C++函数,但我尝试过的方法不起作用。

这是我的尝试:

foo.cpp

#include <iostream>

class Foo{
    public:
        void bar(int number){
            printf("Number is: %d", number);
            std::cout << "Test!" << std::endl;
        }
};

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

fooWrapper.py

from ctypes import 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)

num = 5    
f = Foo()
f.bar(num)

我得到这个错误。尝试编译C++函数:

foo.cpp: In function ‘void Foo_bar(Foo*)’:
foo.cpp:13: error: expected primary-expression before ‘int’

我做错了什么?提前致谢。

4

1 回答 1

2

这条线

    void Foo_bar(Foo* foo){ foo->bar(int number); }

似乎很不对劲。int number将是一个变量 decleration,但您想将变量作为参数提供给方法。为此,它需要在 的方法定义中Foo_bar

尝试:

    void Foo_bar(Foo* foo, int number){ foo->bar(number); }

在你的 Python 代码中

def bar(self, number):
    lib.Foo_bar(self.obj, number)
于 2013-08-07T09:24:37.890 回答