gcc有__attribute__((weak))
,允许创建一个弱符号,如函数。这允许用户重新定义功能。我想在XC8中有相同的行为。
更多信息:
我正在为XC8编写驱动程序,我想将低级初始化委托给用户定义的函数。
我知道可以重新定义一个函数:有一个putch
函数在XC8的源文件中实现,并由printf函数调用。允许用户在其应用程序内重新实现putch
。有两个具有相同名称的函数,但不会引发错误。
putch
在XC8源文件中的实现有一条评论说“实施不力。可能需要用户实现”,所以必须有可能。
我在XC8的用户指南中查看了pragma,但没有与此问题相关的指令。
答案 0 :(得分:2)
链接器将仅搜索静态库以解析尚未由输入对象文件解析的符号,因此可以在没有弱链接的情况下替换静态库函数。弱链接对于作为源代码或目标代码提供的代码非常有用,而不是作为静态库。
因此,如果不支持弱连接指令,则可以为" weak"创建一个静态库。符号和链接。
IAR兼容性指令__weak
和weak
pragma的XC8 manual文档行为,在这两种情况下都会忽略指令(仅在XC16和XC32中受支持),所以你将不得不使用上面提出的方法,这在任何情况下都更便携 - 如果有点不方便。
在putch()
的情况下,我怀疑这不符合你的想法。我想这不是一个弱联系的问题;在包含printf()
的静态库中,存在一个未解析的putch()
链接,链接器使用您提供的任何内容解析它;如果您要编译并链接Microchip实现和您的源代码,您将收到链接器错误;同样,如果您不提供任何实现,您将收到链接器错误。
答案 1 :(得分:0)
XC8编译器确实支持“弱”属性。
weak属性使声明作为弱符号发出。弱符号表示如果有相同符号的全局版本可用,则应改用该版本。如果将weak属性应用于对外部符号的引用,则链接不需要该符号。
例如:
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));