extern "C" 用于加载 dlsym 的函数
extern "C" for functions loaded with dlsym
在 C++ 项目中,我正在加载 .so
和 dlopen
和 dlsym
。 .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");
}
在 C++ 项目中,我正在加载 .so
和 dlopen
和 dlsym
。 .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");
}