Как экспортировать шаблон класса статической переменной DLL окна

Я не знаю, как экспортировать статическую переменную, которая находится внутри шаблона, в мой исполняемый файл.

Я использую библиотеку 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, а другой для исполняемого файла «myprogram.exe».

Когда я собираю то же самое в Linux, он работает как положено:

createEntity componenthdnlr OK!!
test componenthndlr OK!!

Поэтому я думаю, что это должно быть что-то о видимости Windows DLL в GCC.
Я новичок в этом мире Windows DLL, и я не знаю точно, где и что я должен экспортировать, чтобы это работало.

Я использую MSYS2 с GCC 5.2.0 для компиляции.
Спасибо

0

Решение

Я не знаю, является ли это лучшим решением, но оно работает:

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

Таким образом, он создает только один экземпляр этой статической переменной.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector