Я поймал в ловушку "undefined reference to vtable..."
на целый день.
На самом деле, я видел много ответов на вопрос "undefined reference to vtable..."
Например:
неопределенная ссылка на vtable "Транзакция"
Неопределенная ссылка на vtable
https://gcc.gnu.org/faq.html#vtables
Неопределенная ссылка на vtable
Одни люди забывают написать виртуальную функцию, другие забывают добавить файл .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'
Вы можете увидеть много пустых функций, потому что я игнорирую какой-то нерелевантный код. Но в этом случае все равно есть ошибка.
Может ли кто-нибудь мне помочь? Спасибо.