我想将程序编译到共享库中,但是当我使用它时,如果在编译时使用的其中一个对象具有继承,则会出现未定义的符号错误。我已经简化了它以便更容易理解,但基本上它看起来像这样:
api.hpp:
#ifndef API_H
#define API_H
//std libraries
#include <deque>
#include <memory>
#include "simulations/simulationA.hpp"
class Api {
public:
Api();
~Api();
private:
std::deque < std::shared_ptr<Simulation> > _simulations_queue;
};
#endif
simulation.hpp:
#ifndef SIMULATION_H
#define SIMULATION_H
class Simulation {
public:
Simulation(int simulation_id);
~Simulation();
virtual void run();
protected:
int _simulation_id;
};
#endif
simulation.cpp
#include "simulation.hpp"
Simulation::Simulation(int simulation_id)
{
_simulation_id = simulation_id;
}
Simulation::~Simulation()
{
}
simulationA.hpp
#ifndef SIMULATIONA_H
#define SIMULATIONA_H
//std libraries
#include <string>
#include <atomic>
#include <unordered_map>
#include "simulation.hpp"
class SimulationA : public Simulation{
public:
SimulationA(int simulation_id);
~SimulationA();
void run();
};
#endif
simulationA.cpp
#include "simulationA.hpp"
SimulationA::SimulationA(int simulation_id) : Simulation(simulation_id)
{
}
SimulationA::~SimulationA()
{
}
void SimulationA::run()
{
}
最初,为了编译它我做了以下事情:
g++ -c -fpic api.cpp -o api.o
g++ -c -fpic simulation.cpp -o simulation.o
g++ -c -fpic simulationA.cpp -o simulationA.o
g++ -shared -o shared_api.so api.o simulationA.o simulation.o
它编译得很好,但是当我创建一个api实例对象时,会抛出以下错误:
undefined symbol _ZTI10Simulation
这只是因为继承而发生的。如果我删除它不会给出错误。为什么会这样?我试图改变链接顺序,用-Wl, - start-group -Wl, - end-group编译它,但到目前为止还没有工作。