문제

나는 다음 코드를 공유 라이브러리로 컴파일했다. 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 init, cleanup, 그리고 bar.

공유 라이브러리를로드하려고 할 때 (사용 dyn.load 안에 R) 오류가 발생합니다.

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

그래서 그것은 그것을 찾을 수없는 것 같습니다 Foo 건설자. 내가 무엇을 잘못하고 어떻게 해결할 수 있습니까?

업데이트: 감사합니다, JBAR! 그래서 그것은 그랬습니다 Foo 구조기. 오류 메시지에서 암호 상징에서 이것을 알 수 있습니까? _ZN3FooD2Ev? 그렇습니다 D 안에 FooD 소멸자를 대변 하시겠습니까?

도움이 되었습니까?

해결책

우리는 순수한 가상 파괴자를 선언 할 수 없습니다. 가상 소멸자가 순수하다고 선언 되더라도, 적어도 소멸자를 위해 빈 몸체를 구현해야합니다.

다른 팁

업데이트 : 그래서 Foo Destructor였습니다. 오류 메시지에서 암호 상징에서 이것을 알 수 있었을 수 있습니까? _ZN3FOOD2EV? 음식의 D는 소멸자를 의미합니까?

프로그램 C ++ Filt를 사용할 수 있습니다.

따라서 c ++ filt _zn3food2ev는 "foo :: ~ foo ()"를 반환합니다.

업데이트를 고려하면 "_zn3food2ev"는 "foo :: ~ foo ()"입니다. 엉망이되었습니다.

"demangle"프로그램을 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top