问题:我在"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
文件,我需要在其中覆盖这些函数。如果除了使用弱属性之外还有其他方法,那也没关系。
您错过了名称篡改。
C++中的void Default_Handler(void)
是对象文件(Assembler中(中的?Default_Handler@@YAXXZ
。别名时应该使用损坏的名称:
void Default_Handler(void);
__attribute__((weak, alias("_Z15Default_Handlerv"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("_Z15Default_Handlerv"))) void EXTI15_10_IRQHandler(void);
void Default_Handler(void)
{
while(1);
}
或者使旧名称extern "C"
extern "C" 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);
}
您可以使用-Xlinker --no-demangle
链接器选项获取损坏的名称。
您不需要声明,因为别名发生在链接阶段。这也适用于:
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
extern "C" void Default_Handler(void)
{
while(1);
}