虫子 静态库 太子语言
c++筑器 c与c++静态库互调
vs19下静态库动态库互调
C++调C
我们就用以前的括号匹配做例子。当时我们是用栈来操作的,然后在我们真正需要执行的函数前把栈的函数一一的写出来,这样的的确确可以锻炼我们开始的代码能力,但是也不可以一直重头才来不是吗,所以我们就可以调库
第一步建静态库
1.我们不是需要栈吗,那我们就把Stack.c和Stack.h放到空项目里面,然后改一下项目属性
1.创建空项目,把 Stack.c 和 Stack.h 放进来
2.修改项目属性为静态库属性
调用静态库
只要有==头文件和静态库文件==,其他项目就可以调用了
上面我们是==c++项目==,但是我们调的库是==c写的库==,然后报了链接错误,==就是c++修饰后的函数名去静态库中找结果找不到==
找不到的原因是
- ==我们只是包含了头文件,也就是只有声明,但是没有定义,没有定义也就是没有地址,然后链接call的时候要去找函数的地址,但是没地址你咋找,找到天荒地老也不会找到。找不到的原因就是我们没有链接动态库==
链接动态库
如果我们把==Stack.c== 改成 ==Stack.cpp== 的话他们修饰函数规则就是一样的
非常完美的跑出来了
==这里我们可以看到我们c++调用c++的静态库是可以的==
但是我们的目的不是调用c++的静态库不是吗,我们是要调用c的静态库
==我们可以把静态库想象成目标文件==,我们用c++的call去调用c写的静态库能调的动吗,应该不行吧,并不是静态库中没有这些函数的地址,而是==生成函数名的修饰规则==不一样,也就不能准确映射到c静态库的地址上
既然不可以准确映射,但还想调用c静态库。==extern “C”应运而生==
extern “C”
用extern "C"把下面头文件包括起来是为了告诉编译器该 头文件展开里面的函数是c的风格编译的,不要用c++生成函数名的修饰规则去找,而是用c生成函数名的修饰规则去找
C调C++
c调用c是不出意外的,但是我们是想c调用c++
既然不可以正常映射到地址,那还要用到我们营运而生的extern “C”,==但是我们不可以在c项目里面使用,因为我们c不认识extern “C”,所以我们要去c++的静态库里面去用extern “C”把该调的函数括起来,让他知道我们c项目会来调你,你好好的包装一下==
因为我们c项目里面头文件展开是会把extern “C”的程序展开的,但是c还是看不懂extern “C”啊,所以我们还要来一层把extern “C”给包起来,让c看得懂
==__cplusplus是在c++才会出现的标识符,c中没有这个标识符==
法一
法二
总结
c++项目调用C的库 要在c++程序中加extern “C”
c项目中调用c++的库 要在c++静态库中加extern “C”,同时不要忘了需要条件编译,因为extern “C”在c项目中展开c是不认识的
- 点赞
- 收藏
- 关注作者
评论(0)