extern c
c++程序如何调用c静态库 |
创建一个静态库:在vs2019中,首先创建一个空项目,把exe的后缀改成静态库
cpp项目如何调用这个静态库?也得包它的头文件
#include"../DS/stack.h"//..就是往上一层目录跳,找到相对路径
这时可以编译,但是会发生链接错误
原因:包含的头文件,只是声明,没有定义
我们需要再配置两个环境
1.
2.添加DS.lib;
到这里如果cpp调用静态库的cpp就通过了,但cpp调用c为什么不行?
因为c和cpp函数名修饰规则不同
该怎么解决?用extern "C"包含调用的头文件
extern "C"
{
#include"../DS/stack.h"//..就是往上一层目录跳,找到相对路径
}
告诉c++编译器extern "c"{}里面的函数是c编译器编译的,链接的时候用c的函数名修饰规则去找,就可以链接 |
c项目如何调用cpp静态库呢? |
extern "C"
{
void StackInit(ST* ps);void StackDestroy(ST* ps);void StackPush(ST* ps, STDataType x);void StackPop(ST* ps);STDataType StackTop(ST* ps);bool StackEmpty(ST* ps);
}
如果我们只是简单的把cpp静态库里函数的声明用extern “c”{}包起来是不行的
因为c项目了会把头文件展开,而c编译器不认识extern “c”
这里我们用条件编译
//C++静态库,就会按c的函数名修饰规则处理以下函数
#ifdef __cplusplus
extern "C"
{
#endifvoid StackInit(ST* ps);void StackDestroy(ST* ps);void StackPush(ST* ps, STDataType x);void StackPop(ST* ps);STDataType StackTop(ST* ps);bool StackEmpty(ST* ps);
#ifdef __cplusplus
}
#endif
C++中有__cplusplus标识符,而C中没有__cplusplus标识符
或者按下面这样
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C//被替换成空
#endif
//extern "C"告诉编译器按c的函数名修饰规则处理
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 bool StackEmpty(ST* ps);
总结:C++程序 调用 c的库,在C++程序中加extern "C" || C程序 调用C++的库,在C++库中加extern "C" |