繁体   English   中英

C ++共享库中基类的未定义符号错误

[英]Undefined symbol error for base class in C++ shared library

我使用g++ -shared ...将以下代码编译为共享库g++ -shared ...

class Foo {
public:
  Foo() {}
  virtual ~Foo() = 0;
  virtual int Bar() = 0;
};

class TestFoo : public Foo {
public:
  int Bar() { return 0; }
};

extern "C" {
  Foo* foo;
  void init() {
    // Runtime error: undefined symbol: _ZN3FooD2Ev
    foo = new TestFoo(); // causes error
  }
  void cleanup() { delete(foo); }
  void bar() { foo->Bar(); }
}

关键是要将我的类的功能(这里只是最小的玩具类作为一个例子)公开为一个简单的C API,它有三个函数initcleanupbar

当我尝试加载共享库(在R使用dyn.load )时,我收到一个错误:

unable to load shared library 'test.so':
test.so: undefined symbol: _ZN3FooD2Ev

所以,它似乎无法找到Foo构造函数。 我做错了什么,如何解决?

更新 :谢谢,jbar! 所以它是Foo de structor。 我可以从错误消息中的神秘符号中知道这个: _ZN3FooD2Ev吗? FooDD代表析构函数吗?

更新:所以它是Foo析构函数。 我可以从错误消息中的神秘符号中知道这个:_ZN3FooD2Ev吗? FooD中的D代表析构函数吗?

您可以使用程序c ++ filt。

所以c ++ filt _ZN3FooD2Ev返回“Foo :: ~Foo()”。

我们不能声明纯虚析构函数。 即使虚拟析构函数被声明为纯粹的,它也必须为析构函数实现一个空体(至少)。

鉴于您的更新,“_ ZN3FooD2Ev”是“Foo ::〜Foo()” 损坏

看看“demangle”计划。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM