gcc有__attribute__((weak)),它允许创建一个弱符号,例如一个函数。这允许用户重新定义函数。我希望在XC8中有同样的行为。
更多信息:
我正在为XC8编写一个驱动程序,我希望将低级别初始化委托给用户定义的函数。
我知道可以重新定义一个函数:在XC8的源文件中实现并由printf函数调用的putch函数。允许用户在应用程序中重新实现putch。有两个名称相同的函数,但没有引发错误。
putch在XC8源文件中的实现有一条评论说“实现弱,可能需要用户实现”,所以这是可能的。
我看了XC8的用户指南中的语用,但是没有关于这个问题的指示。
发布于 2017-05-19 17:28:37
链接器只会搜索静态库来解析输入对象文件尚未解析的符号,因此可以在不弱链接的情况下替换静态库函数。弱链接对于作为源代码或目标代码提供的代码是有用的,而不是作为静态库。
因此,如果不支持弱链接指令,则可以为“弱”符号创建静态库并将其链接起来。
XC8手册记录了IAR兼容性指令__weak和weak实用化的行为,在这两种情况下,这些指令都被忽略(仅在XC16和XC32中支持),因此您必须使用上述建议的方法,这在任何情况下都要更便携--如果有点不方便的话。
在putch()的情况下,我怀疑这不像您所相信的那样有效。我可以想象,这根本不是弱链接的问题;在包含printf()的静态库中,存在一个指向putch()的未解决的链接,并且链接器使用您提供的任何内容来解析它;如果要编译和链接微芯片实现和源代码链接,您将得到一个链接器错误;同样,如果您不提供任何实现,您将得到一个链接器错误。
发布于 2020-08-02 12:38:31
XC8编译器确实支持“弱”属性。
弱属性导致声明作为弱符号发出。弱符号表示,如果同一符号的全局版本可用,则应使用该版本。当弱属性应用于对外部符号的引用时,链接不需要该符号。
例如:
extern int __attribute__((weak)) s;
int foo(void)
{
if (&s)
return s;
return 0; /* possibly some other value */
}在上面的程序中,如果s不是由其他模块定义的,程序仍然会链接,但不会给s地址。条件验证已经定义了s(如果定义了,则返回它的值)。否则返回“0”。此功能有许多用途,主要用于提供可与可选库链接的通用代码。
变量也可以使用“弱”属性进行限定。
例如:
char __attribute__((weak)) input;
char input __attribute__((weak));https://stackoverflow.com/questions/44075604
复制相似问题