虫子 静态库 太子语言

举报
虫子VV 发表于 2022/06/23 00:04:09 2022/06/23
【摘要】 c++筑器       c与c++静态库互调 vs19下静态库动态库互调 C++调C 第一步建静态库 1.创建空项目,把 Stack.c 和 Stack.h 放进来 2.修改项目属性为静态库属性 调用静态库 链接动态库 extern “C” C调C++ 法一 法二 总结 c++筑器       c与c++静态库互调 vs19下静态库动态库互调 C++调C我们就用以前的括号匹配做例子。当时我...

c++筑器       c与c++静态库互调

vs19下静态库动态库互调

image-20211208202139722

C++调C

我们就用以前的括号匹配做例子。当时我们是用栈来操作的,然后在我们真正需要执行的函数前把栈的函数一一的写出来,这样的的确确可以锻炼我们开始的代码能力,但是也不可以一直重头才来不是吗,所以我们就可以调库

image-20211208202954763

image-20211208203049881

第一步建静态库

1.我们不是需要栈吗,那我们就把Stack.c和Stack.h放到空项目里面,然后改一下项目属性

1.创建空项目,把 Stack.c 和 Stack.h 放进来

image-20211208205713237

image-20211208205749446

image-20211208205805155

image-20211208205828339

image-20211208205901519

image-20211208205915440

image-20211208205926923

2.修改项目属性为静态库属性

image-20211208210455374

image-20211208210817331

image-20211208211017924

image-20211208211253546

调用静态库

只要有==头文件和静态库文件==,其他项目就可以调用了

image-20211208212142422

上面我们是==c++项目==,但是我们调的库是==c写的库==,然后报了链接错误,==就是c++修饰后的函数名去静态库中找结果找不到==

image-20211208212734476

找不到的原因是

  1. ==我们只是包含了头文件,也就是只有声明,但是没有定义,没有定义也就是没有地址,然后链接call的时候要去找函数的地址,但是没地址你咋找,找到天荒地老也不会找到。找不到的原因就是我们没有链接动态库==

链接动态库

image-20211208214108454

image-20211208214324109

image-20211208214604963

如果我们把==Stack.c== 改成 ==Stack.cpp== 的话他们修饰函数规则就是一样的

image-20211208214848266

非常完美的跑出来了

image-20211208214937175

==这里我们可以看到我们c++调用c++的静态库是可以的==

但是我们的目的不是调用c++的静态库不是吗,我们是要调用c的静态库

==我们可以把静态库想象成目标文件==,我们用c++的call去调用c写的静态库能调的动吗,应该不行吧,并不是静态库中没有这些函数的地址,而是==生成函数名的修饰规则==不一样,也就不能准确映射到c静态库的地址上

既然不可以准确映射,但还想调用c静态库。==extern “C”应运而生==

extern “C”

用extern "C"把下面头文件包括起来是为了告诉编译器该 头文件展开里面的函数是c的风格编译的,不要用c++生成函数名的修饰规则去找,而是用c生成函数名的修饰规则去找

image-20211208232858628

image-20211208233047616


C调C++

image-20211208233658052

image-20211209194856639

image-20211209195942435

c调用c是不出意外的,但是我们是想c调用c++

image-20211209200547690

既然不可以正常映射到地址,那还要用到我们营运而生的extern “C”,==但是我们不可以在c项目里面使用,因为我们c不认识extern “C”,所以我们要去c++的静态库里面去用extern “C”把该调的函数括起来,让他知道我们c项目会来调你,你好好的包装一下==

image-20211209201655255

因为我们c项目里面头文件展开是会把extern “C”的程序展开的,但是c还是看不懂extern “C”啊,所以我们还要来一层把extern “C”给包起来,让c看得懂

==__cplusplus是在c++才会出现的标识符,c中没有这个标识符==

image-20211209204645238

法一

image-20211209205325585

法二

image-20211209210446178

总结

c++项目调用C的库 要在c++程序中加extern “C”

c项目中调用c++的库 要在c++静态库中加extern “C”,同时不要忘了需要条件编译,因为extern “C”在c项目中展开c是不认识的

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。