2015-10-12 40 views
0

我不知道如何将模板内部的静态变量导出到我的可执行文件中。如何导出类模板静态变量DLL windows

我使用的是有分量的模板entityx库:

Entity.h:

struct BaseComponent { 
public: 
    typedef size_t Family; 
protected: 
    static Family family_counter_; //THIS!! 
}; 

template <typename Derived> 
struct Component : public BaseComponent { 
public: 
    typedef ComponentHandle<Derived> Handle; 
    typedef ComponentHandle<const Derived, const EntityManager> ConstHandle; 

private: 
    friend class EntityManager; 
    /// Used internally for registration. 
    static Family family(); 
}; 

Entity.cpp:

BaseComponent::Family BaseComponent::family_counter_ = 0; 

现在我有我的库链接到entityx并使用: World.hpp:

#include <entityx/entityx.h> 

namespace edv { 
class Transform : public entityx::Component<Transform> { 
public: 
    Transform(); 
}; 

class World { 
public: 
    World(); 
    entityx::Entity createEntity(); 
private: 
    entityx::EventManager m_events; 
    entityx::EntityManager m_entities; 
}; 
} 

World.cpp:

#include <Endavant/game/World.h> 
#include <iostream> 

namespace edv { 
Transform::Transform() { 
} 

World::World(): m_entities(m_events){ 
} 

void World::update() { 
} 

entityx::Entity World::createEntity() { 
    auto e = m_entities.create(); 
    e.assign<Transform>(); 
    auto c = e.component<Transform>(); 
    if (c.valid()) { 
     std::cout<<"createEntity componenthdnlr OK!!"<<e.id()<<std::endl; 
    } else { 
     std::cout<<"createEntity componenthdnlr INVALID!!"<<e.id()<<std::endl; 
    } 
    return e; 
} 

} 

现在我建立一个可执行的 “myprogram.exe” 链接到我的图书馆EDV和entityx:

#include <Endavant/Root.h> 
#include <Endavant/game/World.h> 

void test() { 
    auto entity = edv::Root::get().getWorld().createEntity(); 
    auto comp = entity.component<edv::Transform>(); 

    if (comp.valid()) { 
     std::cout<<"test componenthndlr VALID!!"<<entity.id()<<std::endl; 
    } else { 
     std::cout<<"test componenthndlr INVALID!!"<<entity.id()<<std::endl; 
    } 
} 

int main() { 

    try { 
     edv::Root::get().init(); 
     test(); 
     edv::Root::get().run(); 
    } catch (std::exception & e) { 
     std::cout<<e.what()<<std::endl; 
    } 
    return 0; 
} 

当我执行 “myprogram.exe” 它输出:

createEntity componenthdnlr OK!! 
test componenthndlr INVALID!! 

我调试的应用程序,它似乎也有“family_counter_”静态变量一个是我的DLL两个实例,而另一个在t他可执行文件“myprogram.exe”。

当我编译同样在Linux中,它按预期工作:

createEntity componenthdnlr OK!! 
test componenthndlr OK!! 

因此,我认为它应该是关于GCC的Windows DLL的知名度。 我是新来的这个Windows DLL世界,我不知道究竟在哪里以及我必须导出哪些内容才能完成这项工作。

我使用MSYS2和GCC 5.2.0来编译这个。 谢谢

回答

0

我不知道这是不是最好的解决办法,但它的工作原理:

extern template class entityx::Component<edv::Transform>;

这样它将只创建一个静态变量的实例。