【发布时间】:2021-05-28 22:59:25
【问题描述】:
我正在使用一个共享库实用程序,它从共享库中查找符号(在非 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。
对于我找不到的模板实例化是否有一些特殊处理?
我找到了一种不同的方法,可以返回我需要的东西,但我仍然对任何关于为什么它不起作用的资源感兴趣!
【问题讨论】:
-
删除
-C选项。你想要错位的名字,这就是GetProcAddress期望的名字。 -
啊,谢谢你说得有道理。但是,名称修饰取决于编译器,对吗?所以这不会是编译器可移植的,更不用说平台无关了。
-
你不能指望独立于平台的二进制文件;
lib.so肯定无法在 Windows、Mac 或 Android 手机上运行。是的,名称修饰方案通常是特定于编译器的;如果您想从库中导出一些可移植的名称,请坚持使用纯 C 函数。
标签: c++ gcc shared-libraries ros2