__attribute__((weak))

一、强引用

      强引用:对外部目标文件的符号引用在目标文件被最终链接成可执行文件时,它们必须被正确的决议,如果没有找到该符号的定义,链接器就会报未定义错误,这种被称为强引用。典型例子如下:

/*file main.c*/

#include <stdio.h> 

extern void test(void);

int main(int argc,char* argv[]){
    test();
    printf("fun main \n");
    return 0;
}

编译时会报错:

$ gcc -o main main.c 
/tmp/ccsWdxmr.o:在函数‘main’中:
main.c:(.text+0xb0):对‘test’未定义的引用
main.c:(.text+0xb8):对‘test’未定义的引用
collect2: 错误:ld 返回 1

二、弱引用

弱引用:对于GCC,使用__attribute__((weak))关键字来声明的函数称为弱引用。 对外部目标文件的符号引用在目标文件被最终链接成可执行文件时,如果没有找到该符号的定义,链接器不会认为它是一个错误,程序可以正常编译完成。示例如下:

/*file main.c*/

#include <stdio.h> 

extern void __attribute__((weak)) test(void);  //弱引用 test可以不实现

int main(int argc,char* argv[]){
    if(test) test();    //对于未定义的弱引用,链接器默认值为0
    printf("fun main \n");
    return 0;
}

再次使用gcc编译,可以成功编译。只不过此时test符号为0,执行main时就不会调用函数test。编译和运行结果如下:

$ gcc -o main main.c 
$ ./main
fun main

接下来我创建一个新的文件test.c,并实现test函数。

/* file test.c */

#include <stdio.h>

void test(){
  printf("fun test \n");
}

使用gcc时,通过参数”-fPIC -shared“ 来生成动态链接库libtest.so。命令如下:

$ gcc -fPIC -shared -o libtest.so test.c 

再次生成可执行程序main时,通过参数“-L. -ltest“链接了libtest.so后,main文件内就有了test的占位符。那么在执行main时就会检测到函数test的存在并跳转执行,运行结果如下:

$ gcc -L. -ltest -o main main.c 
$ ./main
fun test
fun main

三、弱引用的意义

弱引用的存在可以使得程序使用自定义版本的库函数;也使得程序功能更加容易剪裁和组合。

比如上面libtest.so中对test的实现是仅仅输出”fun test \n“ 。你也可以有别的类似libtest1.so 、libtest2.so等等。里面对test做你想要的实现。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海棠花败

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值