C与C++互相调用对方静态库

创建静态库流程

首先我们学会如何建立静态库.lib

创建一个工程,写一个头文件和一个.C/.CPP文件,头文件包含.C文件中函数的声明。

C与C++互相调用对方静态库_第1张图片

右击正在运行的项目:Stack

C与C++互相调用对方静态库_第2张图片

点击属性:按步骤修改.exe到.lib

C与C++互相调用对方静态库_第3张图片

然后对文件进行编译

C与C++互相调用对方静态库_第4张图片

编译成功的到一个.lib静态库文件,这个静态库的类型根据编译的语言类型,

.C就是C静态库.Cpp就是C++静态库,这里生成的是.cpp的静态库,存放函数的定义

C与C++互相调用对方静态库_第5张图片

这时候打开项目的Debug文件夹就可以就会.lib文件了。

导入静态库到项目中

首先将.lib导入项目,我们需要手动做一些调整

C与C++互相调用对方静态库_第6张图片

  1. 右击打开项目的属性

  1. 点击连接器常规一栏

  1. 在连接器中找到添加库目录

  1. 打开文件夹,将stack项目的Debug路径导入,然后确定。

接下来导入Debug下使用的静态库名称,

C与C++互相调用对方静态库_第7张图片
  1. 在连接器的插入一行。

  1. 在附加依赖项,输入静态库名称stack.lib;

完成静态库导入操作项目中。

C调用C++静态库

首先,介绍extern "C" {}声明该空间内的函数在编译时是以C语言的函数名修饰规则形成符号表,extern 该关键词只能在C++编译器下使用,在C语言环境里会报错。

所以我们C语言不能直接调用当前的C++静态库,

现在C++的静态库中函数名都是以C++函数名修饰规则命名的,而C语言调用时会链接失败

所以我们要对头文件进行处理,在头文件声明展开的时候,采用C语言的修饰规则,并且在C++静态库生成时,以C语言函数名修饰规则来创出静态库,保证两边都是以C语言函数名修饰规则,确保完成使用静态库,不会发生链接错误。就是Cpp的函数也用C语言的修饰规则生成静态库,

使用extern "C"{}


#ifdef __cplusplus 
extern "C"
{
#endif
    void StackInit(ST* ps);
    void StackDestroy(ST* ps);
    void StackPush(ST* ps, STDataType x);
    void StackPop(ST* ps);
    STDataType StackTop(ST* ps);
    int StackSize(ST* ps);
    bool StackEmpty(ST* ps);
    void ReallocCapacity(ST* ps);
#ifdef __cplusplus 
}
#endif

extern "C" 告诉编译器,如果有__cplusplus 宏的情况下,C++函数是以C语言函数名修饰规则的汇编码。

当需要调用的静态库的.C项目中,没有该宏定义,不会再源文件中展开extern "C",避免了报错。

还有一种方法避免了不同C使用该头文件报错的方法


#ifdef __cplusplus 
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif

EXTERN_C    void StackInit(ST* ps);
EXTERN_C    void StackDestroy(ST* ps);
EXTERN_C    void StackPush(ST* ps, STDataType x);
EXTERN_C    void StackPop(ST* ps);
EXTERN_C    STDataType StackTop(ST* ps);
EXTERN_C    int StackSize(ST* ps);
EXTERN_C    bool StackEmpty(ST* ps);
EXTERN_C    void ReallocCapacity(ST* ps);

在C++编译器下,有 __cplusplus 宏,EXTRN_C在预编译时会被替换为 extern "C" 前序有该关键词的函数,将C++函数名修饰规则改变为C语言函数命名修饰规则。

在C编译器下,没有 __cplusplus 宏 EXTRN_C在预编译时就会被替换为空,不影响函数在C编译器下的修饰规则。

C与C++互相调用对方静态库_第8张图片

C++调用C静态库

而C++调用C静态库,也可以使用这样的头文件,当这头文件在C++编译器下,内的函数会以C语言函数名修饰规则编译,

C++编译器下,头文件中修饰规则改变

C与C++互相调用对方静态库_第9张图片

而静态库在C编译器下,没有__cplusplus 宏,不会包含extern "C",避免看编译报错;

C与C++互相调用对方静态库_第10张图片

此时两边的修饰规则一样,所以这个时候,运行程序可以执行。


总结:

C++程序调用C的静态库,在C++程序中加extern "C"

C程序调用C++的静态库,在C++静态库中加extern "C"

你可能感兴趣的:(c++,开发语言)