「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
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
找不到的原因是
- 我们只是包含了头文件,也就是只有声明,但是没有定义,没有定义也就是没有地址,然后链接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”应运而生