C语言调用C++动态链接库

Wesley13
• 阅读 576

C调用C++接口,这个问题的解决和C++调用C动态链接库是类似的。话不多说,直接上例子来进行说明。

helloworld_cpp.h文件

#include<iostream>
using namespace std;

class CHello
{
private:
    
public:
    CHello();
    ~CHello();

    void Print_HelloWorld();
};

helloworld_cpp.cpp文件

#include "helloworld_cpp.h"

void CHello::Print_HelloWorld()
{
    cout << "Hello World!" << endl;
}

CHello::CHello()
{
}

CHello::~CHello()
{
}

到这里,我们实际实现的内容都以及全部完成了。现在我们需要做一些改变以使得C能够调用到C++接口。下面我们再写个接口文件。

helloworld_interface.h文件,该文件提供给C语言使用,使得C语言能够调用C++的接口。需要调用该接口的代码,就需要包含此文件,例如下面的mian.c文件就包含了该文件。

#ifndef HELLOWORLD_INTERFACE_H
#define HELLOWORLD_INTERFACE_H

#ifdef __cplusplus
extern "C"{
#endif

void Print_HelloWorld();

#ifdef __cplusplus
}
#endif

#endif //HELLOWORLD_INTERFACE_H

helloworld_interface.cpp文件,这个文件将C++的接口变成了C语言可以调用的接口。在这个文件中需要包含helloworld_cpp.h文件,因为它需要使用CHello这个类。但是不能在helloworld_interface.h文件包含,因为C语言需要包含helloworld_interface.h文件,否则会导致编译不过去。

#include "helloworld_interface.h"
#include "helloworld_cpp.h"

static CHello g_interface;

void Print_HelloWorld()
{
    g_interface.Print_HelloWorld();
}

至此,我们的C++文件就写完了,将其编译为动态链接库。使用的命令如下:

g++ -shared -fPIC helloworld_cpp.cpp helloworld_interface.cpp -o libhelloworld_cpp.so

编译之后,生成名为libhelloworld_cpp.so的动态链接库。将其拷贝一份到/usr/lib目录之下。

我们编译main.c文件来调用C++接口,其内容如下。

#include "helloworld_interface.h"

int main()
{

    Print_HelloWorld();

    return 0;
}

编译main.c文件,命令如下:

gcc main.c -o main -L. -lhelloworld_cpp

./main执行main,输出如下所示:

C语言调用C++动态链接库

本文同步分享在 博客“zy010101”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c
Stella981 Stella981
3年前
Linux查看GPU信息和使用情况
1、Linux查看显卡信息:lspci|grepivga2、使用nvidiaGPU可以:lspci|grepinvidia!(https://oscimg.oschina.net/oscnet/36e7c7382fa9fe49068e7e5f8825bc67a17.png)前边的序号"00:0f.0"是显卡的代
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这