c语言函数之间互相调用符号,如何实现C和C++函数互相调用
链接库头文件:
//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++函数互相调用相关推荐
- c语言规定 程序中各函数之间().,C语言基础笔试题
1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____ A.顺序结构,选择结构,循环结构 B.递归结构,循环结构,转移结构 ...
- c语言函数指针做解释器,自己动手写解释器(1):函数定义和调用
(作者码字辛苦,转载请以超链接形式注明出处) 最近在学习编译原理,于是准备自己动手写一个脚本语言.准备用一些文章记录其中遇到的问题和解决的方法.这些文章需要有一些编译原理,YACC, LEX的储备知识 ...
- c语言之函数或者变量的weak属性 C语言之强化,弱化符号weak
__weak是一个宏,和__packed是同一种东西都是gcc的扩展属性: #define __packed __attribute__((packed)) #define __weak __attr ...
- c语言中接口和函数的区别,接口与类的关系_接口函数和调用函数有什么区别
描述 接口与类的关系 类与接口是两个概念,不能混淆. 接口概念 程序接口是操作系统为用户提供的两类接口之一,编程人员在程序中通过程序接口来请求操作系统提供服务.面向过程语言最基本的单元是过程和函数. ...
- Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能
Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...
- 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 ...
- php 调用变量方法名,php中引用(变量和函数名前加符号)用法
本文章来给大家介绍在php中我们常看到在在php变量前面加个&符号,这个就是php中引用符号了,它可以用于各种变量.函数.对象了下面我来给各位详细介绍php&符号用法.在 PHP 中引 ...
- c语言中规定,程序中各函数之间,C语言题库-函数_(参考).doc
C语言函数练习题 选择题 1.在函数的说明和定义时若没有指出函数的类型,则( A ) A: 系统自动地认为函数的类型为整型. B: 系统自动地认为函数的类型为字符型. C: 系统自动地认为函数的类型为 ...
- c语言中 调用函数除函数名外,【单选题】在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分)
A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值...
[单选题]在 C 语言中 , 调用函数除函数名外 , 还必须有 ( ). (10.0分) A. 函数预说明 B. 实际参数 C. ( ) D. 函数返回值 更多相关问题 下列关于IMOECDIS性能标 ...
最新文章
- LeetCode 973. K Closest Points to Origin--TopK 问题--最小堆--C++,Python解法
- 赛道一出,今后无需再熬夜
- 语法分析器 java实验报告_词法分析器实验报告.doc
- mpvue微信小程序动画_mpvue微信小程序系列
- 如何证明在素数p和2p之间存在另一个素数呢?简单却不完备的证明
- VTK:图表之VertexSize
- 关于cp命令中拷贝所有的写法
- psql: FATAL the database system is in recovery解决
- 删库不必跑路,谈数据库删除设计
- 搞定使用MySQL导入外部的SQL文件执行
- python多线程控制暂停_python中的多线程编程与暂停、播放音频的结合
- 用juniversalchardet解决爬虫乱码问题
- Codeblocks下载、安装的详细过程
- ISP - bayer 是什么?
- 最近 火火火 的开源项目
- android的吸顶效果,吸顶效果解决方案
- OpenGL+VS2015相关类库配置
- 四重境界:人渣、小人、君子、圣人
- win10开机小键盘灯不亮
- 【React】一路走来并持续竞走
热门文章
- html5 项目案例_互动案例技术分析(3)
- node 多进程 vs java_node多进程服务器
- 华为手机所有图标变黑_华为官博科普手机状态栏小图标含义,总共分为4大类...
- tf.boolean_mask
- linux查看flash插件更新,Linux用户:快更新Flash Player修复漏洞
- 基于双向匹配的陌生人社交策略及算法思考
- R语言实战应用精讲50篇(二)-多重线性回归系列之稳健回归
- hadoop学习--多表关联
- Python入门100题 | 第039题
- 实战项目五:抓取简书文章信息