C语言调用C++实现的库函数方法

简介: C语言调用C++实现的库函数方法

C语言调用C++实现的库函数方法

Linux 平台

Windows 平台

在 C 语言代码工程中经常会用到其他高级语言生成的动态、静态库函数,对于这种情况就需要进行特别处理。本文针对 C++ 实现的一系列库函数在 C 语言代码中的调用方式进行研究说明。


Linux 平台

首先,需要在库函数的头文件中使用 extern C 进行函数声明,使得 C 语言在包含头文件的时候也能够获得函数声明。具体如下:


自定义实现一个 C++ 打印函数,源代码:


#include "myprint.h"
#include <iostream>
void myprint(char *buf)
{
    if(!buf)
    {
        return;
    }
    std::cout << "MY print:" << buf << std::endl;
}


这个源代码和普通的 C++ 代码没有什么区别,但是头文件中需要添加一些针对 C 语言的声明,具体如下:


#ifndef __MYPRINT_H
#define __MYPRINT_H
#ifdef __cplusplus  
extern "C"{   
#endif
void myprint(char *buf);
#ifdef __cplusplus  
}  
#endif
#endif


可以看到,我们在函数头文件声明时专门声明了该函数的 C 语言函数声明。然后调用 g++ 进行库函数编译,针对 C++ 的库的制作一定要使用 g++,使用 gcc 是会报错的。具体如下:


$ g++ myprint.cc -shared -o libmyprint.so  -fPIC -Xlinker -rpath=./

这样就已经生成了一个动态库 libmyprint.so ,然后我们编写一个简单的 C 测试代码来调用试一下:


#include <stdio.h>
#include "myprint.h"
int main()
{
    printf("test begin:\n");
    myprint("hello world!");
    printf("test end\n");
    return 0;
}


在编译测试程序时主要添加链接库的参数。如下:


gcc test.c -o test -lmyprint -L./ -I. -Xlinker -rpath=./ 

注意一定要加入后面两个参数,则表示传递给编译器连接库指定的加载目录,使得gcc能够加载 C++ 的动态库。


最终测试结果:


$ ./test 
test begin:
MY print:hello world!
test end


Windows 平台

【待添加】


相关文章
|
4天前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
18 6
|
4天前
|
安全 C++
超级好用的C++实用库之环形内存池
超级好用的C++实用库之环形内存池
19 5
|
4天前
|
缓存 网络协议 Linux
超级好用的C++实用库之套接字
超级好用的C++实用库之套接字
19 1
|
4天前
|
存储 算法 安全
超级好用的C++实用库之sha256算法
超级好用的C++实用库之sha256算法
10 1
|
4天前
|
存储 算法 安全
超级好用的C++实用库之国密sm4算法
超级好用的C++实用库之国密sm4算法
14 0
|
4天前
|
网络协议 Linux C++
超级好用的C++实用库之网络
超级好用的C++实用库之网络
13 0
|
4天前
|
算法 安全 Serverless
超级好用的C++实用库之国密sm3算法
超级好用的C++实用库之国密sm3算法
10 0
|
15天前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
60 30
|
4天前
|
并行计算 Unix Linux
超级好用的C++实用库之线程基类
超级好用的C++实用库之线程基类
12 4
|
4天前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台