前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C封装C++动态库常见问题(一)

C封装C++动态库常见问题(一)

原创
作者头像
liuzhen007
修改2024-01-24 22:51:58
3120
修改2024-01-24 22:51:58
举报
文章被收录于专栏:流媒体音视频流媒体音视频

前言

众所周知,实现一个复杂的功能,使用 C++ 的开发周期要比使用 C 语言更短,性价比更高,注意前提是不考虑性能。所以,在一个由 C 语言开发的程序中扩展复杂功能时,可以考虑用 C++ 实现,再封装出 C 语言接口,由原程序调用即可。这不我在实际开发工作中就遇到了这种情况,于是特意总结了一些常见问题。

常见问题

问题1、unknown type name ‘bool’

编译时报错,详细内容如下:

error: unknown type name ‘bool’; did you mean ‘_Bool’

出现这个报错的原因是编译器遇到了不识别的类型名:‘bool’,因为 C 语言标准(C89)中没有定义布尔类型,所以会报错。但是在 C99 标准中增加了 bool 类型的定义,true 代表 1,false 代表 0,所以只要导入 stdbool.h 头文件就行了,引用方式如下:

代码语言:c
复制
// 引用头文件 
#include <stdbool.h>

问题2、不识别智能指针

我们都知道 C 语言中是没有智能指针概念的,因此在封装 C 适配层时需要将智能指针换行成 void* 类型指针,下面以 shared_ptr(string)共享智能指针为例进行介绍:

代码语言:cpp
复制
std::shared_ptr<std::string>& a_string;
// std::shared_ptr 转 void*
void* myData = (void*)a_string.get();
// void* 转 std::shared_ptr 
std::shared_ptr<string> myString((std::string*)myData); 

进一步抽象一个模板出来:

代码语言:cpp
复制
std::shared_ptr<T> smart;
// std::shared_ptr 转 void*
void *myData = smart.get();
// void* 转 std::shared_ptr 
std::shared_ptr<T> myST((T*)myData); 

问题3、undefined symbol: *function

我们在导出 C++ 动态库时需要在封装层中声明 extern "C" 语句,它的作用是实现 C 和 C++ 的混合编程。在 C++ 源文件中的语句前面加上 extern "C" 语句,就是告诉编译器需要按照类 C 的编译方式和链接方式来编译和链接,这样在 C 语言的代码中就可以调用 C++ 的方法和变量了。

同时,为了动态控制编译选项,一般会配合预编译条件宏 #ifdef__cplusplus 使用,代码框架如下:

代码语言:cpp
复制
#ifdef __cplusplus
extern "C" {
#endif

// C 语言代码部分

#ifdef __cplusplus
}
#endif

结尾

本文介绍了一些C语言封装C++动态库时的常见问题。如果大家喜欢,我再继续整理,今天就先到这里,欢迎小伙伴评论留言讨论。

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 常见问题
    • 问题1、unknown type name ‘bool’
      • 问题2、不识别智能指针
        • 问题3、undefined symbol: *function
          • 结尾
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档