Статические объекты не связаны в статической библиотеке в VC 2010. Как принудительно установить ссылку? - PullRequest
2 голосов
/ 17 марта 2011

У меня есть статическая фабрика, которая использует статический член для регистрации класса в фабричной системе.

class Foo_A_Maker : public FooFactory<Foo, const std::string &>
{
private:
    // Register this as a type using a static instance of itself.
    // This is really the only time it is created. That's why the
    // constructor is private.
    Foo_A_Maker() : FooFactory("Foo_A") {}
    static const Foo_A_Maker registerThis;

public:
    virtual std::shared_ptr<Foo> MakeProduct(const std::string& params) const;
};

Это работало годами во всех моих проектах, но теперь я добавил егов статическую библиотеку.В статической библиотеке ctor никогда не вызывается, и объект никогда не регистрируется.Если я помещу этот код в exe-проект, он снова заработает.Я установил, что это не соединение, введя ошибку времени ссылки.

Я что-то упустил?Могу ли я заставить ссылку?И если я использую это через границы компиляции, может ли проект EXE добавить свои собственные фабрики?

Спасибо всем.

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Вот как должны работать библиотеки: компоновщик принимает только те символы, которые ему нужны (ссылки извне). правильный способ решения этой проблемы - предоставить функцию инициализации.

Для Visual Studio вы можете найти точное имя символа, которое вам нужно, и передать /INCLUDE в качестве параметра командной строки компоновщику. Вы можете попробовать с /OPT:NOREF - похоже, это может сработать, но еще не проверял.

0 голосов
/ 17 марта 2011

Статическая переменная-член в определении класса должна сопоставляться с той же переменной за пределами этого класса (я не понимаю точных терминов для каждой части этого). Это означает, что в каком-то CPP-файле вне класса вам нужно написать следующее:

Foo_A_Maker Foo_A_Maker::registerThis;

Это точка, в которой объект создается (то, что он работает в любой программе без этого, немного странно). Поместите это в один из файлов CPP, и все будет в порядке.

Вы также должны иметь возможность поместить это в файл CPP, не объявляя его как статический член в классе. Это был бы более легкий маршрут. То есть удалите статический файл и просто поместите его в файл CPP:

Foo_A_Make registerThis;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...