C ++ 공유 라이브러리의 기본 클래스에 대한 정의되지 않은 기호 오류
-
12-09-2019 - |
문제
나는 다음 코드를 공유 라이브러리로 컴파일했다. 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"프로그램을 확인하십시오.
제휴하지 않습니다 StackOverflow