XC8编译器是否支持弱符号?

时间:2017-05-19 17:14:00

标签: c embedded microcontroller pic xc8

gcc有__attribute__((weak)),允许创建一个弱符号,如函数。这允许用户重新定义功能。我想在XC8中有相同的行为。

更多信息:

我正在为XC8编写驱动程序,我想将低级初始化委托给用户定义的函数。

我知道可以重新定义一个函数:有一个putch函数在XC8的源文件中实现,并由printf函数调用。允许用户在其应用程序内重新实现putch。有两个具有相同名称的函数,但不会引发错误。

putch在XC8源文件中的实现有一条评论说“实施不力。可能需要用户实现”,所以必须有可能。

我在XC8的用户指南中查看了pragma,但没有与此问题相关的指令。

2 个答案:

答案 0 :(得分:2)

链接器将仅搜索静态库以解析尚未由输入对象文件解析的符号,因此可以在没有弱链接的情况下替换静态库函数。弱链接对于作为源代码或目标代码提供的代码非常有用,而不是作为静态库。

因此,如果不支持弱连接指令,则可以为" weak"创建一个静态库。符号和链接。

IAR兼容性指令__weakweak 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));