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

#c #gcc #shared-libraries #ros2

Вопрос:

Я использую утилиту общей библиотеки, которая ищет символы из общей библиотеки (на платформах, отличных от 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>");
 

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

Комментарии:

1. Удалить -C опцию. Вам нужно искаженное имя, вот имя GetProcAddress , которого вы ожидаете.

2. Ах, спасибо, в этом есть смысл. Однако искажение имени зависит от компилятора, верно? Так что это не было бы переносимостью компилятора, не говоря уже о независимости от платформы.

3. Вы не можете ожидать независимого от платформы двоичного файла; это lib.so , безусловно, не будет работать на Windows, Mac или телефоне Android. И да, схемы искажения имен часто зависят от компилятора; если вы хотите, чтобы несколько переносимые имена экспортировались из вашей библиотеки, придерживайтесь простых функций C.

Ответ №1:

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

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

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