XC8 编译器是否支持弱符号?
Does XC8 compiler support weak symbols?
gcc 有 __attribute__((weak))
允许创建弱符号,例如函数。这允许用户重新定义函数。我想在 XC8 中有相同的行为。
更多信息:
我正在为 XC8 编写驱动程序,我想将低级初始化委托给用户定义的函数。
我知道可以重新定义一个函数:XC8 的源文件中实现了 putch
函数,它由 printf 函数调用。允许用户在他的应用程序中重新实现 putch
。有两个同名函数,但没有报错
putch
在XC8的源文件中的实现有注释说"Weak implementation. User implementation may be required",所以一定是可以的。
我在XC8的用户指南中查看了pragmas,但是没有与这个问题相关的指令。
A linker 只会搜索静态库来解析输入目标文件尚未解析的符号,因此可以在没有 weak linkage 的情况下替换静态库函数。 Weak linkage 对于作为源代码或目标代码而不是作为静态库提供的代码很有用。
因此,如果不支持弱 linkage 指令,您可以为 "weak" 符号和 link 创建一个静态库。
XC8 manual 记录了 IAR 兼容性指令 __weak
和 weak
pragma 的行为,在这两种情况下指令都被忽略(仅在 XC16 和 XC32 中支持),所以你将不得不使用上面建议的方法,在任何情况下都更便携 - 如果有点不方便。
在 putch()
的情况下,我怀疑这并不像您认为的那样有效。我想这根本不是link年龄弱的问题;在包含 printf()
的静态库中,存在未解析的 link 到 putch()
,并且 linker 会使用您提供的任何内容解析它;如果您要从源代码编译和 link Microchip 实现和您的实现,您将得到一个 linker 错误;同样,如果您不提供任何实现,您将收到 linker 错误。
XC8 编译器支持“weak”属性。
weak 属性导致声明作为弱符号发出。弱符号表示如果同一符号的全球版本可用,则应使用该版本。当 weak 属性应用于对外部符号的引用时,linking 不需要该符号。
例如:
extern int __attribute__((weak)) s;
int foo(void)
{
if (&s)
return s;
return 0; /* possibly some other value */
}
在上面的程序中,如果s没有被其他模块定义,程序仍然link但是s不会被赋予地址。
条件验证 s 是否已定义(如果有,则 returns 它的值)。否则返回“0”。
此功能有很多用途,主要是提供可以 link 带有可选库的通用代码。
变量也可以用“weak”属性限定。
例如:
char __attribute__((weak)) input;
char input __attribute__((weak));
gcc 有 __attribute__((weak))
允许创建弱符号,例如函数。这允许用户重新定义函数。我想在 XC8 中有相同的行为。
更多信息:
我正在为 XC8 编写驱动程序,我想将低级初始化委托给用户定义的函数。
我知道可以重新定义一个函数:XC8 的源文件中实现了 putch
函数,它由 printf 函数调用。允许用户在他的应用程序中重新实现 putch
。有两个同名函数,但没有报错
putch
在XC8的源文件中的实现有注释说"Weak implementation. User implementation may be required",所以一定是可以的。
我在XC8的用户指南中查看了pragmas,但是没有与这个问题相关的指令。
A linker 只会搜索静态库来解析输入目标文件尚未解析的符号,因此可以在没有 weak linkage 的情况下替换静态库函数。 Weak linkage 对于作为源代码或目标代码而不是作为静态库提供的代码很有用。
因此,如果不支持弱 linkage 指令,您可以为 "weak" 符号和 link 创建一个静态库。
XC8 manual 记录了 IAR 兼容性指令 __weak
和 weak
pragma 的行为,在这两种情况下指令都被忽略(仅在 XC16 和 XC32 中支持),所以你将不得不使用上面建议的方法,在任何情况下都更便携 - 如果有点不方便。
在 putch()
的情况下,我怀疑这并不像您认为的那样有效。我想这根本不是link年龄弱的问题;在包含 printf()
的静态库中,存在未解析的 link 到 putch()
,并且 linker 会使用您提供的任何内容解析它;如果您要从源代码编译和 link Microchip 实现和您的实现,您将得到一个 linker 错误;同样,如果您不提供任何实现,您将收到 linker 错误。
XC8 编译器支持“weak”属性。
weak 属性导致声明作为弱符号发出。弱符号表示如果同一符号的全球版本可用,则应使用该版本。当 weak 属性应用于对外部符号的引用时,linking 不需要该符号。
例如:
extern int __attribute__((weak)) s;
int foo(void)
{
if (&s)
return s;
return 0; /* possibly some other value */
}
在上面的程序中,如果s没有被其他模块定义,程序仍然link但是s不会被赋予地址。 条件验证 s 是否已定义(如果有,则 returns 它的值)。否则返回“0”。 此功能有很多用途,主要是提供可以 link 带有可选库的通用代码。
变量也可以用“weak”属性限定。
例如:
char __attribute__((weak)) input;
char input __attribute__((weak));