2013-08-07 50 views
1

我試圖將Python腳本與C++腳本鏈接起來。我發現這一點,並工作。嘗試從簡單的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’ 

我在做什麼錯了?提前致謝。

回答

2

此行

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

似乎是相當錯誤的。 int number將是一個變量變量,但是你想給一個變量作爲一個方法的參數。爲此,它需要在Foo_bar的方法定義中。

嘗試:

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

和Python代碼

def bar(self, number): 
    lib.Foo_bar(self.obj, number)