C库如何封装成C++接口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C库如何封装成C++接口相关的知识,希望对你有一定的参考价值。

RT,有些C库进行封装后就成了C++接口,这是怎么做到的?反过来呢?能不能给个例子

C一般不能直接调用C++函数库,需要将C++库封装成C接口后,才可以使用C调用。
  下面举例,说明一个封装策略:

//code in add.cxx
#include "add.h"
int sample::method()

cout<<"method is called!\\n";

//code in add.h
#include
using namespace std;
class sample

public:
int method();
;
  将上面的两个文件生成动态库libadd.so放到 /usr/lib目录下,编译命令如下:
  sudo g++ -fpic -shared -g -o /usr/lib/libadd.so add.cxx -I ./
  由于在C中不能识别类,所以要将上面类的成员函数,要封装成C接口函数才能被调用。下面进行封装,将输出接口转换成C接口。
//code in mylib.cxx
#include "add.h"
#ifndef _cplusplus
#define _cplusplus
#include "mylib.h"
#endif

int myfunc()

sample ss;
ss.method();
return 0;

//code in mylib.h
#ifdef _cplusplus
extern "C"

#endif

int myfunc();

#ifdef _cplusplus

#endif
  在linux下,gcc编译器并没用变量_cplusplus来区分是C代码还是C++ 代码(没有宏定义),如果使用gcc编译器,这里我们可以自己定义一个变量_cplusplus用于区分C和C++代码,所以在mylib.cxx中定义 了一个变量_cplusplus用于识别是否需要“extern "C"”将函数接口封装成C接口。但是如果使用g++编译器则不需要专门定义_cplusplus,编译命令如下:
  g++ -fpic -shared -g -o mylib.so mylib.cxx -la -I ./
main.c
#include

#include
#include "mylib.h"

int
main()

int (*dlfunc)();
void *handle; //定义一个句柄
handle = dlopen("./mylib.so", RTLD_LAZY);//获得库句柄
dlfunc = dlsym(handle, "myfunc"); //获得函数入口
(*dlfunc)();
dlclose(handle);

return 0;

  编译命令如下:
  gcc -o main main.c ./mylib.so -ldl
  下面就可以执行了。
  需要说明的是,由于main.c 和 mylib.cxx都需要包含mylib.h,并且要将函数myfunc封装成C接口函数输出需要“extern "C"”,而C又不识别“extern "C"”,所以需要定义_cplusplus来区别处理mylib.h中的函数myfunc。
  在main.c的main函数中直接调用myfunc()函数也能执行,这里介绍的是常规调用库函数的方法。
参考技术A 就是新写一些类便于C++使用。在类的内部调用C库里的函数。
例子:
C库:
lib.c
//假设大数计算的C函数库。
typedef struct char *value;int buflen Num;
Num add(Num a,Num b,Num *res);//加法
Num sub(Num a,Num b,Num *res);//减法
bool delNum(Num a);
bool setNum(Num *a,Num bt);
C++封装:
class cppNum
Num val;
cppNum();//构造函数
cppNum( const cppNum& input)setNum(&val,input.val );;//拷贝构造
cppNum operator+( const cppNum & b) Num res; add(val,input,&res);return res;
cppNum operator-( const cppNum & b) Num res; sub(val,input,&res);return res;
~cppNum()//析构
delNum(val);

;
------------
没必要反过来把把C++封装成C。
能用C++的地方,没必要用C语言调用C++库。只能用C语言的地方不会出现C++库等你封装。
因为C++库不是为C准备的。C不能安全的调用C++对象系统。
参考技术B //比如俄罗斯方块,方块的视作一个对象
typedef struct

short x,y;
short map;
//Others
unsigned long attrib;
BlockType;
void blkInit(BlockType*blk)


void blkMoveLeft(BlockType*blk)


void blkMoveRight(BlockType*blk)


void blkDropDown(BlockType*blk)


//封装成类
class CBlock: public BlockType

public:
CBlock()

blkInit(this);

~CBlock()


void MoveLeft()

blkMoveLeft(this)

void MoveRight()

blkMoveRight(this);

void DropDown()

blkDropDown(this);

;

C++成员函数的调用,默认会有个对象指针传入的,只不过在原型是不可见的,也就是那个this ,用标准C按这样的风格,代码重用/移植都会很方便,就比如早期对文件操作那些库,文件open返回是个int,其实是个指针,该指针指向一个文件描述块 ;又比如,WINDOWS SDK中窗口句柄...

从这些代码,可以看出类与结构的联系,所谓C++,也只是引入一些新规则,在编译态做了些约束和默认的操作而已
参考技术C 柯苞花族洱首迁浑窦皮韧昀僖乙得议朐汾亲岘杉

(转载)8个免费实用的C++GUI库

C++标准中并没有包含GUI,这也使得C++开发图形化界面需要依赖于第三方的库。实际上,图形界面恰恰是C++的强项,小到平常使用的各类桌面软件,大到魔兽世界这样的游戏,都是C++擅长的地方。C++之所以能做到这一点,原因在于它是一门即能提供极高的性能,又能提供良好接口的语言。C性能很高,但是封装太差;Java封装很好,但性能不适合做界面开发,更别谈大型游戏。C++的GUI库除了最为人所熟知的MFC,其实还有其它很多,这篇文章列举了8个免费且实用的C++ GUI库。

C++是一种多范式,遵循自由的形式,并且通用的一门强大的编程语言,这门语言被视为是中间层次的语言,之所以这样认为,是因为它拥有高层语言和底层语言的一些特性。

C++之所以成为最流行的语言之一是有许多原因的,它的应用范围包括系统软件,设备驱动,应用程序软件和许多其他包含客户端程序和娱乐的软件,最好的一个例子是视频游戏。

技术分享图片

GUI是图形用户接口(Graphical User Interface)的缩写,这被定义成用户接口的类型,运行用户直接和电子设备交互而不是通过命令行的形式,这个软件不仅能用在计算机而且还能用在最新的手持设备,例如游戏设备或多种形式的音乐播放器。

今天我们要跟开发者分享C++的GUI库,希望这些库能够帮助开发者,在他们的下一个项目中能够让他们的应用程序拥有让人印象深刻和吸引力的布局。访问下面的目录,并且在留言板中分享你的想法。

1)Qt

Qt是一种跨平台的应用程序和UI框架

它包括一种跨平台的类库,集成开发工具和跨平台的IDE,使用Qt,你可以编写基于Web的应用程序,并且通过许多的桌面和应用程序来部署它们,而无需重写代码。

技术分享图片

2)Fltk

FLTK(发音“Fulltick”)是UNIX/Linux(X11),Microsoft Windows和MacosX上一套跨平台的C++ GUI工具包。FLTK提供现代图形用户界面的功能而没有膨胀(谔谔...这个地方蛋疼了,路过的知道的说一下,原话:FLTK provides modern GUI functionality without the bloat),并且支持3D图形,依靠OpenGL和它内置的GLUT仿真。FLTK被设计成小巧和模块化足以实现静态链接,但作为一个共享库其做工很精细。FLTK也包括一个杰出的UI生成器,叫做FLUID,它能够在秒内创建应用程序。

技术分享图片

3)Fox Toolkit

FOX 是一套基于C++的工具包,能够很容易并且高效地开发图形用户接口,它提供了一个广泛的,而且越来越多,集成的控制,并提供最先进的设备状态,例如拖放,选择,和OpenGL为了3D图形操作的小工具。FOX也实现了图标,图像和方便用户的特性,例如状态行帮助和工具提示,工具提示甚至可以用到3D对象。

 技术分享图片

4)Gpe Phone

GPE Phone版本(G(PE^2))的目的是为移动的Linux设备开发一个基于GTK/GPE的软件栈,特别是移动电话,关于这个软件更多的细节,还有怎么找到它,请看我们的任务陈述:

技术分享图片

5)Lgi

LGI是一个GUI框架,能够抽象提取出全部操作系统的相关性,你可以产生可移植性的代码,它能够处理全部的图形接口函数,线程和信号,网络连接,还有许多的bit位,并且分片来帮助小的,快速的和可依靠的应用程序。

技术分享图片

6)Wx Widgets

wxWidgets是一个C++库,主要是让开发者为Windows,OS X,Linux和UNIX在32-bit和64-bit的体系下开发应用程序,同时也为移动的平台包括像Windows Mobile,iPhone SDK和嵌入式的GTK+。

技术分享图片

7)Ultimate++

U ++是一个C ++跨平台的快速应用程序开发框架,专注于程序员的生产力。它包括一套库(GUI,SQL,etc...),还有一套集成的开发环境。

技术分享图片

8)Zoolib

ZooLib允许您从一个单一的代码库为各种平台和处理器构建本地应用程序,对于特定平台的源的需求不是很大,在极少数情况不可移植的代码变得必要,包括它通过条件编译内联,使用提供的预处理符号之一是简单和容易的事情。

 技术分享图片

以上是关于C库如何封装成C++接口的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 封装的 COM 接口部署 C# 库?

如何在c#中 封装 C++的OCX文件

C++类封装成DLL动态链接库

c++类库是指啥?

使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)

C++封装Halcon算法动态链接库Dll补充