从python问题加载带有静态成员的c++so文件



我有以下来自极客网络的cpp代码:

#include <iostream>
class Geek{
public:
static int i;
void myFunction(){

(Geek::i)++;
std::cout << "Hello Geek!!!" << Geek::i << std::endl;
}
};
int Geek::i=0;
int main()
{
// Creating an object
Geek t; 
// Calling function
t.myFunction();  
return 0;
}
extern "C" {
Geek* Geek_new(){ return new Geek(); }
void Geek_myFunction(Geek* geek){ geek -> myFunction(); }
}

我已经编译了它,并使用以下命令创建了so文件:g++-c-fPIC foo.cpp-o foo.og++-共享-Wl,-soname,libfoo.so-o libfoo.so-foo.o

并从python部分调用了so文件:

# import the module
from ctypes import cdll
# load the library
lib = cdll.LoadLibrary('./libfoo.so')
# create a Geek class
class Geek(object):
# constructor
def __init__(self):
# attribute
self.obj = lib.Geek_new()
self.obj2 = lib.Geek_new()
# define method
def myFunction(self):
lib.Geek_myFunction(self.obj)
lib.Geek_myFunction(self.obj2)
# create a Geek class object
f = Geek()
# object method calling
f.myFunction()
f.myFunction()

当我运行此代码时,我会得到以下错误:./libfoo.so:未定义符号:_ZN4Geek1iE

如果我将静态变量放在函数中并对其进行编译,它可以正常工作,但我需要该变量是类的静态成员。

需要做些什么才能让它发挥作用?

UPDATE我已经根据tevemadar更新了代码,它起了作用。我需要在类之外初始化GEEK::i

感谢tevemadar的回答。我们在类中作为CCD_ 1而不仅仅是CCD_。并在类之外对其进行初始化

int GEEK::i = 0;

更新后的代码可以在问题中看到

最新更新