Где строка
f = reinterpret_cast<void(*)(int*)>(dlsym(RTLD_DEFAULT, "real_f.symbol_name_"));
встречается в test.cc
?Указатель будет инициализирован при выполнении строки (что, конечно, зависит от того, когда вызывается содержащая его функция).Или ты хотел написать
void (*f)(int* ) = reinterpret_cast<void(*)(int*>(dlsym(RTLD_DEFAULT, "real_f.symbol_name_");
?В этом случае указатель будет инициализирован во время статической инициализации.Это означает, что у вас все еще есть порядок проблем с инициализацией, если вы пытаетесь использовать указатели в конструкторе статического объекта.
Классическим решением для этого будет использование какого-то синглтона:
struct LibraryPointers
{
void (*f)(int* );
// ...
static LibraryPointers const& instance()
private:
LibraryPointers();
};
LibraryPointers const&
LibraryPointers::instance()
{
static LibraryPointers theOneAndOnly;
return theOneAndOnly;
}
LibraryPointers::LibraryPointers()
: f( reinterpret_cast<void(*)(int*)>(dlsym(RTLD_DEFAULT, "real_f.symbol_name_")) )
, // initialization of other pointers...
{
}
Затем оберните библиотеку в класс C ++, который использует эту структуру для получения адресов указателей.
И последнее замечание: reinterpret_cast
, который вы пытаетесь сделать, недопустим, вхотя бы формально.(Однако я думаю, что и Sun CC, и g ++ примут его.) Согласно Posix, правильный способ получить указатель на функцию из dlsym
будет выглядеть так:
void (*f)(int* );
*reinterpret_cast<void**>(&f) = dlsym(...);
Это не даетсам по себе инициализации, однако.