Глобальная переменная C ++ не инициализируется при компоновке через статические библиотеки, но ОК при компиляции с исходным кодом

Я создал систему, которая автоматически регистрирует функциональные объекты (функторы) на карте на основе конструктора глобального экземпляра.

В каждом файле cpp, определяющем функтор, есть глобальный экземпляр экземпляра класса регистратора для регистрации функтора в одноэлементном std :: map > объект.

Это определение класса регистратора:

template
<
    typename map_type,
    typename handler_type
>
struct registrar
{
    registrar
        (
             map_type& map_object,
             boost::uint16_t cmd_code,
             const handler_type& handler
        )
        {
          map_object.insert(std::pair(cmd_code, handler));
        }
};

в каждом файле .cpp. Глобальный экземпляр определяется следующим образом:

namespace one_way
{
    static registrar 
        post_receiver(in_out_map_type::instance(), command, handlers());
}

Все работает нормально, если я скомпилирую все cpp вместе с main.cpp. Но если я скомпилирую файл cpp в статическую библиотеку и свяжу его с main.cpp , регистрация не сработает.

Я тестировал VC10 и GCC4.61 как в Windows, так и в Ubuntu 11.10. Оба терпят неудачу.

Я нашел поток с той же проблемой , но OP не сказал, решил он ее или нет.

Я что-нибудь упускаю?


Редактировать


Спасибо за все ответы, включая комментарии.

Каждый ответ действительно помог мне больше думать и глубже исследовать этот метод. После всех исследований и испытаний я, наконец, отказался от идеи полагаться на глобальную / статическую переменную для саморегистрации через границы двоичного кода , потому что нет переносимого способа гарантировать, что это будет работать .

Мой последний способ - сохранить регистрацию в одном двоичном файле.

21
задан t.g. 14 March 2012 в 06:37
поделиться