问题:我在“startup.cpp”中定义了两个弱函数,它们都是同一个文件中定义的一个函数Default_Handler
的别名。即使我正确地对Default_Handler
函数进行了原型化,我还是得到了一个未定义的符号错误。
void Default_Handler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
void Default_Handler(void)
{
while(1);
}
错误日志:
error: 'void EXTI0_IRQHandler()' aliased to undefined symbol 'Default_Handler'
21 | __attribute__((weak, alias("Default_Handler")))void EXTI0_IRQHandler(void);
error: 'void EXTI15_10_IRQHandler()' aliased to undefined symbol 'Default_Handler'
22 | __attribute__((weak, alias("Default_Handler")))void EXTI15_10_IRQHandler(void);
这个错误对我来说没有任何意义,因为目标函数(Default_Handler
)是正确定义的。
我猜这和C++中的名称篡改有关,但实际上我不知道如何处理这个问题。所以如果你能帮忙的话我会很感激的。
我实际需要的是从另一个cpp文件覆盖void EXTI0_IRQHandler(void)
和void EXTI15_10_IRQHandler(void)
的可能性:假设我有一个main.cpp
文件,我需要在其中覆盖这些函数。如果除了使用弱属性之外还有其他方法,那就好了。
1条答案
按热度按时间pengsaosao1#
你错过了名字的混乱。
C++中的
void Default_Handler(void)
是对象文件中的?Default_Handler@@YAXXZ
(在汇编程序中)。别名时,应使用损坏的名称:或将旧名称设为
extern "C"
您可以使用
-Xlinker --no-demangle
链接器选项获得损坏的名称。您不需要声明,因为别名发生在链接阶段。这也适用于: