Stworzyłem system, który automatycznie rejestruje obiekty funkcji (funktory) w mapie na podstawie konstruktora instancji globalnej.Zmienna globalna C++ nie zainicjowana po połączeniu z bibliotekami statycznymi, ale OK, gdy skompilowano ją ze źródłem
W każdym pliku cpp, który definiuje funktor, istnieje globalna instancja instancji klasy rejestratora w celu zarejestrowania funktora na obiekcie singleton std::map<int, std::function<...> >
.
Jest to definicja klasy rejestratora:
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<boost::uint16_t, handler_type>(cmd_code, handler));
}
};
w każdym pliku .cpp. Instancja globalna jest zdefiniowana w następujący sposób:
namespace one_way
{
static registrar <in_out_map_type, handler>
post_receiver(in_out_map_type::instance(), command, handlers());
}
Wszystko działa dobrze, jeśli skompiluję całość cpp razem z main.cpp. Ale jeśli skompiluję plik cpp do statycznej biblioteki i połączę go z main.cpp
, rejestracja nie będzie działać.
Testowałem z VC10 i GCC4.61 zarówno na Windows & i Ubuntu 11.10. Oba zawodzą.
Znalazłem a thread with the same problem, ale OP nie powiedział, czy to rozwiązał, czy nie.
Czy brakuje mi czegoś?
Edit
Dzięki za wszystkie odpowiedzi, w tym komentarze.
Każda reakcja rzeczywiście pomogła mi przemyśleć i zbadać tę metodę. Po tych wszystkich badaniach i próbach, w końcu zrezygnował z powołując się na zmiennej globalnej/statyczne do samodzielnej rejestracji ponad granicami binarnych, bo nie ma przenośny sposobem na zagwarantowanie będzie działać.
Ostatnim sposobem jest zachowanie rejestracji w jednym pliku binarnym.
Nie pokazujesz, jak dzwonisz do rejestratora zarejestrowanych funkcji. Czy jest też literówka w "instancji globalnej" ('handlers()' zamiast 'handler()')? Chyba że czegoś mi brakuje, to definiuje funkcję, a nie zmienną globalną. Tak więc, wydaje mi się, że liczba brakujących punktów na obrazie ... –
Poleganie na statycznej inicjalizacji w celu zarejestrowania funkcji jest prawdopodobnie podatne na błędy w dłuższej perspektywie. Czy rozważałeś właśnie dokonanie jawnej rejestracji? –
Dla GCC, zobacz, czy -Wl, - pomaga całe archiwum. –