首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python问题的静态成员加载c++ so文件

使用python问题的静态成员加载c++ so文件
EN

Stack Overflow用户
提问于 2022-02-23 09:11:00
回答 1查看 47关注 0票数 0

下面的cpp代码摘自极客网站:

代码语言:javascript
复制
#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.o g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o

并从python部分调用so文件:

代码语言:javascript
复制
# 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::我在类之外

EN

回答 1

Stack Overflow用户

发布于 2022-02-23 09:40:55

感谢特维玛达的回答。我们是GEEK::i,而不是班上的i。并在类之外初始化它。

代码语言:javascript
复制
int GEEK::i = 0;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71234130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档