C调用C++链接库

C调用C++链接库:

  1.编写C++代码,编写函数的时候,需要加入对C的接口,也就是extern “c"

  2.由于C不能直接用"class.function”的形式调用函数,所以C++中需要为C写一个接口函数。例如本来要调用student类的talk函数,就另外写一个cfun(),专门建一个student类,并调用talk函数。而cfun()要有extern声明

  3.我在练习中就使用在C++头文件中加extern ”c”的方法。而C文件要只需要加入对cpp.h的引用

  4.详细见如下代码:

    student是一个类,里边有talk函数,就输出一句话而已

    cpp.cpp与cpp.h是两个C++代码,包含对C的接口

    最后用C代码:helloC.c来测试结果

 

  student.cpp:

1None.gif#include <iostream>
2None.gifusing namespace std;
3None.gif#include "student.h"
4ExpandedBlockStart.gifContractedBlock.gifvoid student::talk()dot.gif{
5InBlock.gif cout<<"I am Kenko"<<endl;
6ExpandedBlockEnd.gif}

7None.gif
8None.gif
9None.gif

   student.h:

1None.gif#ifndef _STUDENT_
2None.gif#define _STUDENT_
3None.gif
4ExpandedBlockStart.gifContractedBlock.gifclass studentdot.gif{
5InBlock.gif public:
6InBlock.gif   void talk();
7ExpandedBlockEnd.gif}
;
8None.gif
9None.gif#endif

  cpp.h:

 1None.gif#ifndef _CPP_
 2None.gif#define _CPP_
 3None.gif
 4None.gif#include "student.h"
 5None.gif#ifdef __cplusplus
 6ExpandedBlockStart.gifContractedBlock.gifextern "C" dot.gif{
 7InBlock.gif#endif
 8InBlock.gifvoid helloCplusplus();
 9InBlock.gif#ifdef __cplusplus
10ExpandedBlockEnd.gif}

11None.gif#endif
12None.gif
13None.gif#endif

  cpp.cpp:

 1None.gif#include <iostream>
 2None.gifusing namespace std;
 3None.gif
 4None.gif#include "cpp.h"
 5None.gifstudent stu;
 6ExpandedBlockStart.gifContractedBlock.gifvoid helloCplusplus()dot.gif{
 7InBlock.gifcout<<"helloC++"<<endl;
 8InBlock.gifstu.talk();
 9ExpandedBlockEnd.gif}

10None.gif
11ExpandedBlockStart.gifContractedBlock.gifvoid helloCplusplus2()dot.gif{
12InBlock.gifcout<<"helloC++"<<endl;
13ExpandedBlockEnd.gif}

 

  helloC.c:

 

#include <stdio.h>
#include 
"cpp.h"

int main(){
    helloCplusplus();
     
return 0;
}

 

  我这次练习是直接在xp环境下,在CMD命令行方式用gcc,g++来编译的。

1.编译C++代码,成为链接库

  g++ -shared -o libccall.so cpp.cpp student.cpp  (libccall.so为库名)

2.编译C代码:g++ helloC.c ./libccall.so。这里一定要用g++,如果用gcc会出错,因为gcc编译C++文件才会自动调用g++,但如果对象直接就是C文件就不会调用g++了。

gcc%E4%BC%9A%E5%87%BA%E9%94%99.jpg 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逆透视变换详解 及 代码实现(二)

根据 逆透视变换详解 及 代码实现(一)的原理 下面我用车上拍摄的车道图像&#xff0c;采用逆透视变换得到的图像&#xff0c;给出代码前我们先看下处理结果。 首先是原始图像&#xff1a; 下图为逆透视变换图像&#xff1a; 下面说具体的实现吧&#xff01;&#xff01; 一、…

[赵星理]《简单男人》--歌曲温暖你的心,激励你前进

简单的男人&#xff0c;简单的歌曲&#xff0c;赵星理《简单男人》送给所有身负家庭责任的人&#xff0c;要让家越来越美&#xff0c;再苦再累也不能后退。加油&#xff01;简单男人词曲&#xff1a;赵星理演唱&#xff1a;赵星理累不累也不许落泪醉不醉苦辣都值得回味要让家越…

ArrayList list = new ArrayList(20);中的list扩充几次

16. ArrayList list new ArrayList(20);中的list扩充几次&#xff08;&#xff09; A 0 B 1 C 2 D 3 答案&#xff1a;A ArrayList动态扩容机制 初始化&#xff1a;有三种方式 默认的构造器&#xff0c;将会以默认的大小来初始化内部的数组&#xff1a;public …

利用ATL创建com组件和如何在程序中使用组件的接口函数和设置接口的属性

这是一个ATL开发实例的流程&#xff1a; 1. 在atl中插入一个atl实例&#xff0c;然后添加一个类&#xff0c;派生自ccmdtarget。 2. 添加相应的属性或者方法&#xff0c;在这里需要明白一点的是&#xff0c;这个属性和方法其实是一个概念&#xff0c;只是添加一个属…

java 课外练习题

1.下列哪些是Thread类中的方法&#xff08;&#xff09; A start() B run() C exit() D getPriority() 解析&#xff1a;线程的就绪状态&#xff1a;新建线程后start()方法的调用&#xff0c;来启动线程&#xff0c;但此时线程并没有进入运行状态&#xff0c;只是…

关于ubuntu 是否需要使用std::到问题。

首先是在ubuntu下编译c要使用g&#xff0c;比如 g -Wall 01knap2.cpp -o 01knap2 而如果是编译c语言文件的话则需要用 gcc -Wall 01knap2.c -o 01knap2 即可&#xff0c;g编译得到的是.cpp文件&#xff0c;而gcc编译得到的是.c文件。 第二个是关于是否能够直接使用cout&#…

对一道基础string题及其变式题的思考与解析

1、下面程序的运行结果是&#xff08;&#xff09;&#xff08;选择一项&#xff09; String str1“hello”; String str2new String(“hello”); System.out.println(str1str2); A.true B.false C.hello D.he 答案&#xff1a;B 分析&#xff1a;str1没有使用new关键字&am…

Redo Log 和Checkpoint not complete

首先我们来看下 alertSID.log 日志&#xff1a; Mon Nov 30 17:31:54 2009 Thread 1 advanced to log sequence 14214 (LGWR switch) Current log# 3 seq# 14214 mem# 0: /u03/oradata/newccs/redo03.log Mon Nov 30 17:34:29 2009 Thread 1 advanced to log sequence 14215 (L…

组合数学中的项链计数

给c种不同颜色宝石能穿成多少种长度为s的宝石项链&#xff08;本质不同&#xff09; Burnside定理的应用&#xff1a; 当n为奇数时&#xff0c;有n种翻转&#xff0c;每种翻转都是以一个顶点和该顶点对边的中点对称。有k^(n/21)*n种。 当n为偶数时&#xff0c;有n种翻转&#x…

蓝桥杯 算法训练(四)结点选择(树形动态规划)

结点选择&#xff08;树形动态规划&#xff09;C语言 问题描述 有一棵 n 个节点的树&#xff0c;树上每个节点都有一个正整数权值。如果一个点被选择了&#xff0c;那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少&#xff1f; 输入格式 第一行包含一个整数…

SCVMM

通过SCVMM实现并管理虚拟机高可用性 1、 添加群集主机2、 创建虚拟网络3、 创建虚拟机并实现高可用性接着上一篇文章&#xff0c;这次我们来看一下&#xff0c;如果通过SCVMM R2来实现虚拟机的高可用性。首先将群集主机添加到SCVMM 1、 登陆到计算机Win2008R2&#xff0c;打开S…

机器学习统计学相关书籍

1. 《统计学完全教程》 All of statistics 卡耐基梅隆 沃塞曼 2. 第四版《概率论与数理统计》 莫里斯。德格鲁特&#xff08;Morris H.DeGroot&#xff09;和马克。舍维什&#xff08;Mark J.Shervish&#xff09; 3. 《线性代数导论》 吉尔伯特。斯特朗--网上视频教程堪称经…

序列化包含多种不明类型的集合

序列化包含多种不明类型的集合 代码&#xff1a;/Files/zhuqil/Kirin.rar 导言: 你是否曾经想过序列化构造对象&#xff0c;它里面有一个集合&#xff0c;这个集合包含接口或者抽象类&#xff1f;你是否不知道所有的你要序列化的类型&#xff1f;好吧&#xff0c;如果这样&…

机器学习入门方法推荐(少走弯路)入门视频推荐

入门可以看看下列的几个课程。第一第二个公认的经典了。1、首先当然是吴恩达的经典机器学习了&#xff0c; 可以在万能的b站搜&#xff0c;也可以在网易公开课搜 吴恩达机器学习http://study.163.com/course/courseMain.htm?courseId10045700292、台大林轩田教授的机器学习基石…

NLP大神推荐的机器学习入门书单(附大量百度网盘电子书)

转载自&#xff1a;http://blog.csdn.net/surgent777/article/details/53895048 继NLP之后&#xff0c;我又开了ML这个大坑。这是因为NLP涉及到太多的ML模型&#xff0c;仅仅拿过来用的话&#xff0c;我实现的HanLP已经快到个人极限了。而模型背后的原理、如何优化、如何并行化…

$HOME/$user/.权限导致用户无法登陆图形界面

在redhat linux下&#xff0c;用户登陆图形界面时将在$HOME/$user/.目中添加隐藏文件&#xff08;以.开头的文件&#xff09;&#xff0c;如果在无意中将$HOME/$user/.的写权限去除&#xff0c;将会导致用户无法成功登陆gnome&#xff0c;在正确输入用户名和密码的情况下&#…

想要入坑机器学习?这是MIT在读博士的AI心得

从科研社区中汲取营养找论文AI 领域的论文可以在 arXiv 上找到和发布。现在的论文数量非常令人振奋。社区中的许多人降低了从噪声中分辨出信号的难度。Andrej Karpathy 开发了 arXiv sanity preserver&#xff0c;帮助分类、搜索和过滤特征。Miles Brundage 每晚都在推特上发布…

修改EIGRP 路径cost 值,以及分析和实现等价与非等价负载均衡

一、拓扑图&#xff1a;二、配置各路由器的IP和EIGRP 协议&#xff0c;并保证邻接关系的形成。1、我要达到的目的是要让R2到192.168.14.0/24这个网段能在R2和R1断开之后&#xff0c;形成网网络的快速收敛。因为根据EIGRP 的次优路径进拓扑关系的形成条件是要满足FC&#xff08;…

C++函数的用法:erase函数

前面的文章中提到过如何向容器中添加元素&#xff0c;这里介绍一个如何删除容器中元素的函数&#xff0c;包括顺序容器和关联容器。 就是这个erase函数&#xff0c;基本用法如下&#xff1a; c.erase(p)------------------------------从c中删除迭代器p指定的元素&#xff0c;…