#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
флаг).