g ++ undefined symbol链接动态库

时间:2015-08-17 17:07:53

标签: c++ dynamic-linking

我想将程序编译到共享库中,但是当我使用它时,如果在编译时使用的其中一个对象具有继承,则会出现未定义的符号错误。我已经简化了它以便更容易理解,但基本上它看起来像这样:

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编译它,但到目前为止还没有工作。

0 个答案:

没有答案