共享库符号查找模板实例化

问题描述

我使用共享库实用程序从共享库中查找符号(在使用 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 标志)。