问题描述
我使用共享库实用程序从共享库中查找符号(在使用 GetProcAddress
的非 Windows 平台上)。
这适用于正常功能。
但是,我需要一个函数,它是命名空间中的模板实例化。
我已使用 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
。
是否有一些我找不到的模板实例的特殊处理?
我找到了一种不同的方法,可以返回我需要的东西,但我仍然对任何关于为什么不起作用的资源感兴趣!
解决方法
我已经确认使用 nm -gDC lib.so 库包含符号,并且在我的查找尝试中拼写完全相同,但找不到。
正如 Igor Tandetnik 正确评论的那样,库实际上导出的名称是C++
被破坏的名称,不是 {{ 1}}(这是 demangled 名称)。
要查看实际符号名称,请使用 rosidl_typesupport_cpp::get_service_type_support_handle<example_interfaces::srv::AddTwoInts>
(特别是省略 nm -D lib.so
标志)。