Создание экземпляра шаблона поиска символов в общей библиотеке

Я использую утилиту общей библиотеки, которая ищет символы из общей библиотеки (на платформах, отличных от Windows, с помощью GetProcAddress). Это работает для обычных функций. Однако мне нужна функция, которая представляет собой экземпляр шаблона в пространстве имен. Я подтвердил с помощью nm -gDC lib.so, что библиотека содержит символ, и написал его точно так же при попытке поиска, но его не удалось найти.
nm -gDC lib.so

...
0000000000009575 T rosidl_service_type_support_t const* rosidl_typesupport_cpp::get_service_type_support_handle<example_interfaces::srv::AddTwoInts>()
...

Я попытался найти:

GetProcAddress((HINSTANCE)(lib), "rosidl_typesupport_cpp::get_service_type_support_handle<example_interfaces::srv::AddTwoInts>");

но он возвращает nullptr.
Есть ли какая-то специальная обработка для экземпляров шаблона, которую я не смог найти?
Я нашел другой метод, который возвращает мне то, что мне нужно, но мне все равно будет интересно любые ресурсы о том, почему это не сработало!


person Stefan Fabian    schedule 28.05.2021    source источник
comment
Удалить вариант -C. Вы хотите искаженное имя, это имя ожидает GetProcAddress.   -  person Igor Tandetnik    schedule 29.05.2021
comment
А, спасибо, это имеет смысл. Однако изменение имени зависит от компилятора, верно? Так что это не будет переносимым компилятором, не говоря уже о платформенно-независимой.   -  person Stefan Fabian    schedule 29.05.2021
comment
Вы не можете ожидать, что двоичный файл будет независимым от платформы; что lib.so определенно не будет работать на Windows, Mac или телефоне Android. И да, схемы изменения имен часто зависят от компилятора; если вы хотите, чтобы несколько переносимых имен экспортировались из вашей библиотеки, придерживайтесь простых функций C.   -  person Igor Tandetnik    schedule 29.05.2021


Ответы (1)


Я подтвердил с помощью nm -gDC lib.so, что библиотека содержит символ и написал его точно так же при попытке поиска, но он не может быть найден.

Как правильно заметил Игорь Тандетник, имя, которое библиотека фактически экспортирует, является C++ искаженным именем, а не rosidl_typesupport_cpp::get_service_type_support_handle<example_interfaces::srv::AddTwoInts> (которое является искаженным имя).

Чтобы увидеть фактическое имя символа, используйте nm -D lib.so (в частности, опустите флаг -C).

person Employed Russian    schedule 29.05.2021