Я хочу получить доступ к символу класса из моей общей библиотеки (.so)
Это правильный путь мне нужно сделать это.
MyClass* pMyClass= (MyClass*)dlsym(phandle, "MyClass");
Если это правильный путь, тогда у меня должен быть заголовок MyClass для приведения.
Я хочу знать, есть ли другой способ сделать это, не включая заголовок?
Спасибо
Как известно, dlsym возвращается в основном void *
нетипизированный указатель.
Этот указатель является адресом символа — просто число. Если у вас есть
class MyClass instance;
в вашем .so, dlsym вернет значение &instance
, Там нет другой информации там. к dlsym
, instance
это просто адрес области памяти. Если у тебя есть
char instance[sizeof(MyClass)]
вы получите точно такое же значение.
Итак, чтобы ответить на ваш вопрос — нет, нет сведений о содержании символа, адрес которого dlsym
возвращается. Вы должны добавить это знание самостоятельно. Вот почему вы должны бросить результат dlsym
и именно поэтому вам нужно включить заголовочный файл.
Единственные символы, которые вы можете получить с dlsym
те, которые
соответствуют чему-то в памяти: объект или функция.
Имя класса не является ни тем, ни другим. Вы можете получить указатель на объект
типа класса, но вы ничего не можете сделать с ним (даже имя
тип класса) без заголовка где-то. (Ты можешь использовать
предварительное определение класса в точке, где вы делаете
dlsym
, но так как вы ничего не можете сделать с указателем на
неполный тип, это не купит вам много void*
.)