链接库头文件:

//head.h

class A

{

public:

A();

virtual ~A();

int gt();

int pt();

private:

int s;

};

.cpp

//firstso.cpp

#include

#include "head.h"

A::A(){}

A::~A(){}

int A::gt()

{

s=10;

}

int A::pt()

{

std::cout<

}

编译命令如下:

g++ -shared -o libmy.so firstso.cpp

这时候生成libmy.so文件,将其拷贝到系统库里面:/usr/lib/

进行二次封装:

.cpp

//secso.cpp

#include

#include "head.h"

extern "C"

{

int f();

int f()

{

A a;

a.gt();

a.pt();

return 0;

}

}

编译命令:

gcc -shared -o sec.so secso.cpp -L. -lmy

这时候生成第二个.so文件,此时库从一个类变成了一个c的接口.

拷贝到/usr/lib

下面开始调用:

//test.c

#include "stdio.h"

#include "dlfcn.h"

#define SOFILE "sec.so"

int (*f)();

int main()

{

void *dp;

dp=dlopen(SOFILE,RTLD_LAZY);

f=dlsym(dp,"f");

f();

return 0;

}

编译命令如下:

gcc -rdynamic -s -o myapp test.c

运行Z$./myapp

10

$

关于这个文章的一点补充,转至http://blogs.sun.com/lirincy/

这篇blog写了怎样用C调用C++的库,我试验了一下,在linux上成功,

有两个地方要改一下,最后的编译语句应该是:

gcc -rdynamic -s -o -ldl myapp test.c

还有就是test.c最后应该加上:

dlclose(dp);

否则会CoreDump。

实际上他是把类的方法变成了一个可以外部调用的C函数,用extern C。

二〉C++程序如何调用C语言写的库,如a.lib等,有对应的库头文件a.h。假设a.h中定义了函数:

int WhyCoding(int a, float b);

做法是,

extern "C" {

#include "a.h"

}

extern "C" {

int WhyCoding(int a, float b);

}

从上面可以看出,extern "C" 是用在C和C++之间的桥梁。之所以需要这个桥梁是因为C编译器编译函数时不带

函数的类型信息,只包含函数符号名字,如C编译器把函数int a(float x)编译成类似_a这样的符号,C连接器只要

找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是C编译连接器的缺点。而C++

编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的a函数可能编译成_a_float这样的

符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么C++不支持采用函数返回值来区别函数

重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。

基于以上,C调用C++,首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用,于是extern "C" 的

作用是:让编译器知道这件事,然后以C语言的方式编译和连接封装函数.(通常是把封装函数用C++编译器按C++

方式编译,用了extern "C" 后,编译器便依C的方式编译封装接口,当然接口函数里面的C++语法还是按C++方式

编译;对于C语言部分--调用者,还是按C语言编译;分别对C++接口部分和C部分编译后,再连接就可以实现C

调用C++了).

相反,C++调用C函数,extern "C" 的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是

_a_float来找调用函数。

chai, zheng 1:20 AM, Nov 29, 2006 at nanjing, China

c语言函数之间互相调用符号,如何实现C和C++函数互相调用相关推荐

  1. c语言规定 程序中各函数之间().,C语言基础笔试题

    1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____ A.顺序结构,选择结构,循环结构 B.递归结构,循环结构,转移结构 ...

  2. c语言函数指针做解释器,自己动手写解释器(1):函数定义和调用

    (作者码字辛苦,转载请以超链接形式注明出处) 最近在学习编译原理,于是准备自己动手写一个脚本语言.准备用一些文章记录其中遇到的问题和解决的方法.这些文章需要有一些编译原理,YACC, LEX的储备知识 ...

  3. c语言之函数或者变量的weak属性 C语言之强化,弱化符号weak

    __weak是一个宏,和__packed是同一种东西都是gcc的扩展属性: #define __packed __attribute__((packed)) #define __weak __attr ...

  4. c语言中接口和函数的区别,接口与类的关系_接口函数和调用函数有什么区别

    描述 接口与类的关系 类与接口是两个概念,不能混淆. 接口概念 程序接口是操作系统为用户提供的两类接口之一,编程人员在程序中通过程序接口来请求操作系统提供服务.面向过程语言最基本的单元是过程和函数. ...

  5. Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能

    Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...

  6. C#与Javascript变量、函数之间的相互调用2008年11月28日 星期五 05:28 P.M.1.如何在JavaScript访问C#函数?

    C#与Javascript变量.函数之间的相互调用 2008年11月28日 星期五 05:28 P.M. 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3 ...

  7. php 调用变量方法名,php中引用(变量和函数名前加符号)用法

    本文章来给大家介绍在php中我们常看到在在php变量前面加个&符号,这个就是php中引用符号了,它可以用于各种变量.函数.对象了下面我来给各位详细介绍php&符号用法.在 PHP 中引 ...

  8. c语言中规定,程序中各函数之间,C语言题库-函数_(参考).doc

    C语言函数练习题 选择题 1.在函数的说明和定义时若没有指出函数的类型,则( A ) A: 系统自动地认为函数的类型为整型. B: 系统自动地认为函数的类型为字符型. C: 系统自动地认为函数的类型为 ...

  9. c语言中 调用函数除函数名外,【单选题】在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值...

    [单选题]在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值 更多相关问题 下列关于IMOECDIS性能标 ...

最新文章

  1. LeetCode 973. K Closest Points to Origin--TopK 问题--最小堆--C++,Python解法
  2. 赛道一出,今后无需再熬夜
  3. 语法分析器 java实验报告_词法分析器实验报告.doc
  4. mpvue微信小程序动画_mpvue微信小程序系列
  5. 如何证明在素数p和2p之间存在另一个素数呢?简单却不完备的证明
  6. VTK:图表之VertexSize
  7. 关于cp命令中拷贝所有的写法
  8. psql: FATAL the database system is in recovery解决
  9. 删库不必跑路,谈数据库删除设计
  10. 搞定使用MySQL导入外部的SQL文件执行
  11. python多线程控制暂停_python中的多线程编程与暂停、播放音频的结合
  12. 用juniversalchardet解决爬虫乱码问题
  13. Codeblocks下载、安装的详细过程
  14. ISP - bayer 是什么?
  15. 最近 火火火 的开源项目
  16. android的吸顶效果,吸顶效果解决方案
  17. OpenGL+VS2015相关类库配置
  18. 四重境界:人渣、小人、君子、圣人
  19. win10开机小键盘灯不亮
  20. 【React】一路走来并持续竞走

热门文章

  1. html5 项目案例_互动案例技术分析(3)
  2. node 多进程 vs java_node多进程服务器
  3. 华为手机所有图标变黑_华为官博科普手机状态栏小图标含义,总共分为4大类...
  4. tf.boolean_mask
  5. linux查看flash插件更新,Linux用户:快更新Flash Player修复漏洞
  6. 基于双向匹配的陌生人社交策略及算法思考
  7. R语言实战应用精讲50篇(二)-多重线性回归系列之稳健回归
  8. hadoop学习--多表关联
  9. Python入门100题 | 第039题
  10. 实战项目五:抓取简书文章信息