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

386 阅读3分钟

「这是我参与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

找不到的原因是

  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”应运而生