《C关键字分析》之extern用法

一、假设为三方提供库源码和头文件

1.共享库部分

sanf.c

  1. #include <stdio.h>
  2. int a;
  3. void hello(){
  4. printf("TK------_>>>>>this is hello\n");
  5. }

编译:gcc -shared -fPIC -o libsanf.so sanf.c

生成:libsanf.so

2.头文件

sanf.h

  1. extern int a;
  2. extern "C"{
  3. void hello();
  4. }

以上sanf.h和libsanf.so即为第三方给我们提供的可用资源。

二、如何使用

1.编译链接

main.cpp

  1. #include <stdio.h>
  2. #include "sanf.h"
  3. int main(){
  4. a = 1;
  5. printf("TK------->>>>a is %d\n",a);
  6. hello();
  7. return 0;
  8. }

编译:g++ -c main.cpp

g++ -o main main.o -lsanf -L.

结果:可执行文件main

2.运行

./main

  1. TK------->>>>a is 1
  2. TK------_>>>>>this is hello

三、说明函数添加extern "C"原因

1.我们看C语言sanf.c编译的库libsanf.so中hello的符号

readelf -a libsanf.so

  1. 47: 00000000000005cc    18 FUNC    GLOBAL DEFAULT   11 hello

2.我们看C++语言main.cpp在不添加extern "C"时hello的符号

readelf -a main.o

  1. 13: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z5hellov

在这种情况下,静态链接时就会找不到符号。

3.C++语言main.cpp在添加extern "C"时hello的符号

readelf -a main.o

  1. 13: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND hello

在这种情况下,静态链接时就能找到符号。

原因:

C++语言支持函数多态,导致函数在编译后生成的符号与C不同。

《C关键字分析》之extern用法相关推荐

  1. C# 关键字extern用法

    C# 关键字extern用法 修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还 ...

  2. extern用法详解(转)

    extern用法详解(转)       1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern ...

  3. extern用法详解

    [转]extern用法详解 Posted on 2011-08-16 11:15 单鱼游弋 阅读(98) 评论(0)编辑收藏 1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义 ...

  4. this关键字的四种用法

    this关键字的四种用法 一.this.属性名 表示对象自己的属性使用this调用成员变量,解决变量与局部变量之间的冲突问题 1.实例分析 代码如下(示例): public class Person{ ...

  5. C/C++中 extern用法

    一.定义和声明的区别 声明用来告诉编译器变量的名称和类型,而不分配内存,不赋初值. 定义为了给变量分配内存,可以为变量赋初值. 注:定义要为变量分配内存空间:而声明不需要为变量分配内存空间. 二.ex ...

  6. 、简述global关键字的作用_在C#编程中global关键字的作用及其用法

    在C#编程中,global 是 C# 2.0 中新增的关键字,理论上说,如果代码写得好的话,根本不需要用到它.今天就为大家展示下global关键字的作用及其用法,希望对大家学习C#编程有所帮助. 假设 ...

  7. C#中using关键字的作用及其用法(转)

    C#中using关键字的作用及其用法 using的用途和使用技巧.     using关键字微软MSDN上解释总共有三种用途:     1.引用命名空间.     2.为命名空间或类型创建别名.    ...

  8. 【零基础学Java】—final关键字与四种用法(二十九)

    [零基础学Java]-final关键字与四种用法(二十九) 一.final关键字 final关键字代表最终.不可改变的 常见的四种用法: 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部 ...

  9. 【零基础学Java】—this关键字的三种用法+Java继承的三个特点(二十一)

    [零基础学Java]-this关键字的三种用法+Java继承的三个特点(二十一) 一.this关键字的三种用法 在本类的成员方法中,访问本类的成员变量 在本类的成员方法中,访问本类的另一个成员方法 在 ...

最新文章

  1. windows版influxDB安装与配置
  2. 【网址收藏】k8s zookeeper-operator示例
  3. Python+OpenCV:直方图(Histograms)
  4. [转]谈谈团队的凝聚力
  5. Retrofit 使用flatmap操作符时处理错误、异常
  6. (对比PDF)Adobe Acrobat DC 离线对比PDF、draftable.com/compare 在线对比PDF
  7. 甲骨文超 IBM 成全球第二大软件公司
  8. 使用xml和java代码混合控制UI界面
  9. 扫雷游戏代码+代码分析
  10. postgres的brin索引
  11. 计算机的中央处理器CPU包括什么,中央处理器cpu由哪些组成 中央处理器的作用是什么...
  12. 从《人民的名义》看声纹识别技术在案件侦查中的应用
  13. 外挂、私服为何你们这么猖獗?
  14. PC端下载文件到本地
  15. 接口 和 http协议
  16. ftp服务器上传不了文件怎么办,ftp服务器怎么上传不了文件
  17. UVA10115- Automatic Editing
  18. python生成二维码,实现零件履历表(微信小程序+python后端+mysql)
  19. 《超越平凡的平面设计: 版式设计原理与应用》—设计,无需规则
  20. 大型会议的礼仪(2)

热门文章

  1. android 检测摇一摇
  2. jquery tmpl的使用
  3. PDFBox-convertToImage-type not implemented yet
  4. Grafana 仪表盘和图形编辑器
  5. 神经网络用作分类器(附代码matlab)
  6. 机器学习----监督学习算法之决策树(Decision Tree)
  7. java 数组协变_java 数组协变
  8. 关于抢红包的_关于抢红包现象的材料作文
  9. python实例化次数怎么算_关于python多次实例化
  10. android伸缩动画,Android 伸缩动画xml配置