extern "C" 用于加载 dlsym 的函数

extern "C" for functions loaded with dlsym

在 C++ 项目中,我正在加载 .sodlopendlsym.so 是从 C 源代码编译的,所有函数都有 C 链接。

我唯一无法弄清楚的部分是如何将结果指针转换为 extern "C" 函数,以便实际调用站点使用适当的链接。

我知道其中一个主要区别是名称混淆,我不必担心这一点,因为我使用未混淆的名称来查找带有 dlsym 的函数。

但我的理解是链接的其他方面可能不匹配(我在考虑异常处理,不同的 ABI?)。

我试过了-


extern "C" void (*foo) (void) = (void (*) (void)) dlsym(handle, "foo");

但是编译器不喜欢 extern "C" 局部变量。调用加载了 dlsym 的函数的正确方法是什么?还是我不必担心链接?

编辑:为了进一步澄清这个问题,我需要根据一些模板参数来计算函数指针类型,这使得这更难,并且在答案和评论中的讨论之后,目前不可能这样做(标准正在调整以允许这样做)。当前接受的答案正确回答了所提出的问题。

先介绍一个typedef

extern "C" typedef void (*verb)();
void f() {
  const auto foo=(verb)dlsym(handle, "foo");
}