0

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

更多信息:

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

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

putch在 XC8 的源文件中的实现有一个注释说“弱实现。可能需要用户实现”,所以它必须是可能的。

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

4

2 回答 2

2

链接器只会搜索静态库以解析输入目标文件尚未解析的符号,因此无需弱链接即可替换静态库函数。弱链接对于作为源代码或目标代码而不是作为静态库提供的代码很有用。

因此,如果不支持弱链接指令,您可以为“弱”符号创建一个静态库并将其链接。

XC8 手册记录了 IAR 兼容性指令__weak和pragma的行为weak,并且在这两种情况下,指令都被忽略(仅在 XC16 和 XC32 中支持),因此您必须使用上述建议的方法,在任何情况下都远不止于此便携 - 如果有点不方便。

putch()我怀疑这不像你相信的那样工作的情况下。我想这根本不是弱联系的问题。printf()在包含未解析链接的静态库中putch()存在,并且链接器使用您提供的任何内容解析它;如果您要从源代码编译和链接 Microchip 实现和您的实现,您会收到链接器错误;同样,如果您不提供任何实现,您将收到链接器错误。

于 2017-05-19T17:28:37.740 回答
0

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));
于 2020-08-02T12:38:31.193 回答