zoukankan      html  css  js  c++  java
  • C/C++ 弱符号

    为什么会出现弱符号
    在两个目标文件(a.o与b.o)链接的过程中,如果其中一个目标文件(a.o)通过extern的方式引用了另外一个目标文件(b.o)中的符号flag,但很不幸,在连接的过程中b.o没有被链接进去,所以此时a.o就会报未定义符号flag,那么此时如何解决这个问题呢
    方法1:链接b.o
    这是废话,如果可以直接链接b.o的话,我们就不往下面讲了。。。。
    方法2:使用弱符号
    在a.o中引用b.o中的符号flag时,可以指定符号为弱符号(即:如果其他额外文件中含有flag定义就用额外目标文件中的定义,如果都没有这个符号,则使用自己定义的弱符号)
    举例如下:

    定义test.cpp文件
    flag = 10;
    int function()
    {
        return 1;
    }
    
    定义main.cpp
    #include <stdio.h>
    #include "main.h"
    extern int flag;  // flag为外部定义的变量
    int main()
    {
        printf("flag is %d
    ", flag);
        return 0;
    }
    
    g++ test.cpp main.cpp -o main
    ./main  // flag is 10
    

    以上是正常的使用方法,如果此时在test.cpp中将flag注释掉,执行

    g++ test.cpp main.cpp -o main  // 上报未定义符号flag
    main.cpp:(.text+0x6): undefined reference to `flag'
    
    如果想解决这个问题,就可以引用弱符号,即在main.cpp中定义flag为弱符号,如果外部有该符号,则使用外部的,如果外部没有,则使用自己定义的。

    举例如下:

    定义test.cpp文件
    // flag = 10;
    int function()
    {
        return 1;
    }
    
    定义main.cpp
    #include <stdio.h>
    #include "main.h"
    extern int __attribute__((weak)) flag = 9;
    int main()
    {
        printf("flag is %d
    ", flag);
        return 0;
    }
    
    g++ test.cpp main.cpp -o main
    ./main  // flag is 9
    
  • 相关阅读:
    关于管理的经典故事(员工激励)
    通过SQL语句获取MSSQL数据库的数据字典
    AMF(java)学习笔记(一)
    ActionScript 3.0著名开源库 大集合
    Flash全屏功能详解
    NIO网络编程框架MINA2.0学习笔记(一)
    一份相当巨大的AS类库
    java NIO非阻塞式IO网络编程学习笔记(一)
    数据传输序列化与反序列化协议大全
    RED5学习笔记(一):RED5简介
  • 原文地址:https://www.cnblogs.com/wangdongfang/p/13593815.html
Copyright © 2011-2022 走看看