乐鑫技术交流
直播中

tulin

12年用户 1228经验值
私信 关注
[问答]

__attribute__((weak)) __weak_symbol在idf4.4库中无效的原因?

请教下,在编译时,遇到几个问题:
1.同一个工程中,在不同的C文件写相同的函数,编译时不报错,函数生效随机;
2.使用__attribute__((weak)) __weak_symbol  无效。
请教下,__attribute__((weak)) __weak_symbol   怎么才能起作用。
                                                                                                                                                                  

回帖(1)

张龙祥

2024-6-17 17:54:31
在回答您的问题之前,我们先了解一下相关概念:

1. `__attribute__((weak))` 是 GCC 编译器的一个扩展,用于声明一个符号(变量或函数)为弱符号。弱符号允许在多个编译单元(例如 C 文件)中定义相同的符号,而在链接时只保留一个定义。

2. `__weak_symbol` 是一个宏,用于检查一个符号是否被声明为弱符号。

现在我们来分析您遇到的问题:

问题1:同一个工程中,在不同的C文件写相同的函数,编译时不报错,函数生效随机。

这个问题可能是因为编译器在处理弱符号时,没有按照预期的方式进行。在这种情况下,您可以尝试以下方法:

1. 确保所有函数都使用 `__attribute__((weak))` 声明。
2. 确保所有函数的声明和定义都是一致的,包括函数名、参数列表和返回类型。
3. 在链接时,确保没有其他库或模块引入了相同的函数定义。

问题2:使用 `__attribute__((weak))` 和 `__weak_symbol` 无效。

这个问题可能是由于以下原因导致的:

1. 您的编译器不支持 GCC 扩展,或者没有正确启用这些扩展。请检查您的编译器设置,确保启用了 GCC 扩展。

2. `__weak_symbol` 宏可能没有正确定义。您可以在代码中手动定义这个宏,例如:

```c
#ifndef __weak_symbol
#define __weak_symbol(symbol) __attribute__((weak)) symbol
#endif
```

3. 确保在使用 `__weak_symbol` 宏时,正确地声明了弱符号。例如:

```c
int __weak_symbol(weak_function)(int a, int b) {
    return a + b;
}
```


举报

更多回帖

发帖
×
20
完善资料,
赚取积分