由于系统标头中的类型更改,我在Linux上遇到了可移植性问题。 siginfo_t类型已从命名结构(struct siginfo)更改为未命名结构。对我来说,这在RHEL6和RHEL7之间发生了变化。
我们在一些地方使用ACE,并且在一些公开的接口中有siginfo_t。结果是在RHEL7上编译的代码不会链接到在RHEL6上构建的库。目前,我需要支持这一点。
在RHEL6中,一个问题函数输入为:
ACE_Event_Handler::handle_signal(int, siginfo*, ucontext*)
在RHEL7中,它看起来像这样:
ACE_Event_Handler::handle_signal(int, siginfo_t*, ucontext*)
这些被破坏成不同的符号,导致链接期间失败或运行时符号查找失败。
一个相对简单的解决方案是使用函数别名。但是,我不想修改头文件。我有点挣扎,因为这是一个虚拟成员函数。
我尝试在基于RHEL7构建的ACE版本的Event_Handler.cpp中执行此操作:
struct siginfo;
ACE_Event_Handler::handle_signal(int, siginfo*, ucontext*)
__attribute__((
alias("_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext")
));
有了这个,GCC抱怨说没有宣布这个功能。我最终能够做到这一点,但只有这个丑陋的黑客:
extern "C" int _ZN17ACE_Event_Handler13handle_signalEiP7siginfoP8ucontext()
__attribute__((
alias("_ZN17ACE_Event_Handler13handle_signalEiP9siginfo_tP8ucontext")
));
需要'extern“C”'来防止重新破坏被破坏的名称。
有没有更优雅的方法来实现这一点而不会遇到编译器投诉?