나는 "undefined reference to vtable..."
하루 종일 갇혀 있었다.
사실 저는 많은 답변이 "undefined reference to vtable..."
예를 들면 :
https://gcc.gnu.org/faq.html#vtables
어떤 사람들의 문제는 가상 함수를 작성하는 것을 잊고 다른 사람들은 .cpp 파일을 빌드 디렉토리에 추가하는 것을 잊었습니다. 그러나 나는 그것을 눈치 채고 있다고 생각합니다.
A_1
와 A_2
공유 라이브러리를 원합니다 libA
. A_2
에서 파생됩니다 A_1
.A_1.h
#ifndef include_A_1_h
#define include_A_1_h
class A_1
{
public:
A_1() {}
virtual ~A_1() {} // not pure-virtual function has defined
virtual void print() = 0;
private:
};
#endif
A_2.h
#ifndef include_A_2_h
#define include_A_2_h
#include "A_1.h"
class A_2 : public A_1
{
public:
A_2() {}
~A_2() {}
virtual void print();
private:
};
#endif
A_2.cpp
#include "A_2.h"
void A_2::print()
{
// empty
}
B_1
와 B_2
공유 라이브러리를 원합니다 libB
. B_1
와 B_2
독립적이다.B_1.h
#ifndef include_B_1_h
#define include_B_1_h
#include <iostream>
#include <string.h>
class B_1
{
public:
B_1(const std::string &path);
~B_1();
private:
};
#endif
B_1.cpp
#include "B_1.h"
B_1::B_1(const std::string &path)
{
}
B_1::~B_1()
{
}
B_2.h
#ifndef include_B_2_h
#define include_B_2_h
class B_2
{
public:
B_2() {}
~B_2() {}
void fun();
private:
};
#endif
B_2.cpp
#include "B_2.h"
#include "A_1.h"
#include "A_2.h"
void B_2::fun()
{
A_1 *ptr = new A_2;
}
main.cpp
. 여기에서 뭔가 잘못되었습니다.main.cpp
#include "B_1.h"
int main()
{
B_1 b1("name");
}
다음 명령을 사용하여 컴파일하고 있습니다.
g++ A_2.cpp -fPIC -shared -o libA.so
g++ B_1.cpp B_2.cpp -fPIC -shared -o libB.so
g++ main.cpp -L . -lA -lB
컴파일러는 다음과 같이 말했습니다.
./libB.so: undefined reference to `vtable for A_2'
관련없는 코드를 무시하기 때문에 많은 빈 함수를 볼 수 있습니다. 하지만이 경우에도 여전히 오류가 있습니다.
아무도 나를 도울 수 있습니까? 감사.
라이브러리 B를 컴파일 할 때 공유 라이브러리 A도 제공하십시오.
g++ B_1.cpp B_2.cpp -L . -lA -fPIC -shared -o libB.so
간단히 말해서 (저는 주제에 대한 전문가가 아닙니다), g ++에서 사용하는 ld 링커는 정의되지 않은 기호를보고하는 것입니다. main을 컴파일 할 때 libB에서 해결되지 않은 기호는 libA를 제공하여 해결되지 않습니다. 이는 main에서 명시 적 으로 사용하는 모든 기호 가 libB를 사용하여 해결 되기 때문 입니다.
기본적으로 :
나중에는 많은 유연한 작업을 수행 할 수 있습니다. 그 중에는 라이브러리 간의 순환 종속성이 있습니다 (여기서 libA는 libB에도 의존 할 수 있음).
두 번째 단계에서 실패하려면을 사용하여 정의되지 않은 기호가있는 경우 링커에 실패하도록 명시 적으로 알려야합니다 -z defs
.
g++ B1.cpp B2.cpp -z defs -fPIC -shared -o libB.so
/tmp/cchjkdnAk.o :
A_2::A_2()': B2.cpp:(.text._ZN3A_2C2Ev[_ZN3A_2C5Ev]+0x1b): undefined reference to
A_2 'collect2에 대한 vtable 함수에서 : 오류 : ld가 1 종료 상태를 반환했습니다.
main.cpp가 다음과 같이 작성 되었다면 컴파일 지시문이 작동했을 것입니다.
#include "A_2.h"
#include "B_1.h"
int main()
{
A_1 *ptr = new A_2;
B_1 b1("name");
}
libA는 main의 기호를 해결하기 위해로드되었을 것이며, 해당 기호는 libB의 누락 된 기호에 사용되었을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다