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

2024-01-24 22:51:58 浏览数 (3)

前言

众所周知,实现一个复杂的功能,使用 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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

1 人点赞