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 平台

【待添加】


相关文章
|
1月前
|
监控 网络协议 安全
基于标准C语言实现的跨平台Modbus协议库
基于标准C语言实现的跨平台Modbus协议库
|
3月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
142 26
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
109 0
|
7月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
394 6
|
11月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
256 6
|
11月前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
12月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
459 6
ly~
|
数据可视化 BI API
除了 OpenGL,还有哪些常用的图形库可以在 C 语言中使用?
除了OpenGL,C语言中还有多个常用的图形库:SDL,适合初学者,用于2D游戏和多媒体应用;Allegro,高性能,支持2D/3D图形,广泛应用于游戏开发;Cairo,矢量图形库,支持高质量图形输出,适用于数据可视化;SFML,提供简单接口,用于2D/3D游戏及多媒体应用;GTK+,开源窗口工具包,用于创建图形用户界面。这些库各有特色,适用于不同的开发需求。
ly~
2671 4
|
10月前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
377 0