【问题标题】:How portable is weak linking? #pragma weak my_symbol弱链接的便携性如何? #pragma 弱 my_symbol
【发布时间】:2023-07-31 09:39:01
【问题描述】:
弱链接的可移植性如何?
#pragma weak my_symbol
我看到了这个问题:how-to-make-weak-linking-work-with-gcc 讨论了如何让它工作。但是有没有一种不需要 gcc 的好方法呢?
弱链接和用#ifdef 保护声明有什么区别?
#ifndef my_weak_fn
void my_weak_fn(){/* Do nothing */ return;}
#endif
【问题讨论】:
标签:
c
gcc
linker
portability
weak-linking
【解决方案1】:
#pragma 根据定义,不是可移植的。
弱链接是在链接时完成的(令人惊讶的是)。它允许具有相同签名的函数(或任何符号,实际上)覆盖另一个。这意味着将优先选择强者而不是弱者,但如果没有强者,则会使用弱者。
包含保护由编译器完成,而不是链接器,并且它们确实不允许在强项不存在时回退到弱项。如果您控制两个函数的源,则可以模拟相同的行为(一个是ifdef-ing,另一个是ifndef-ing),但情况并非总是如此,这更多是在两个强大的函数之间进行选择。
弱链接允许您执行一些操作,例如放入自己的 malloc()/free() 以进行调试,同时仍与提供它们的库进行链接。