VS中静态库的创建、链接 和 extern的用法

目录

静态库

​编辑

链接静态库

C的编译器去编译c++写的函数代码 本质是因为c++和c的编译器在对函数重命名的命名方式不同。函数名不同,在链接过程中会找不到对应函数的定义,所以会导致报。

而extern的作用就是将c++编译器以c的风格 命名函数

 我们先看看C编译器在编译函数对函数重命名的风格

这是C++编译器在编译函数对函数重命名的风格

用 extern 在 C++调用C的工程

 我们需要进行一些设置才能真正链接到静态库

用 extern 在C调用C++的工程


        在日常编程过程或者公司工作合作时,我们难免会需要用到他人或者曾经写的代码,但是之前的代码是使用.c格式写的,现在又用的.cpp格式,或者反过来。而ctrl+c,ctrl+v有时又不太合适,这时c++提供了extern"C"来让cpp中的函数以c的形式编译,以下我们看具体用法。

静态库

 静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,链接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。

创建静态库的过程如下图(这里我使用的是VS2022)

这里我们可以看到创建的新静态库工程自带有两个头文件和.cpp文件

我们选择将它们删除

然后,将我们所需要的生成的静态库的.c/.cpp和.h头文件加入进来

 

加入了所需要的生成的静态库的.c/.cpp和.h头文件,进行生成.lib的静态库

这时,解决方案报了一个错   

 C1010    在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"”?  

这是因为VS静态库工程中会自动包含"pch.h",而我们需要手动关闭自动包含。

按照下图进行操作

 

将预编译头设置为   不使用预编译头->应用->确认

 这时我们再进行生成.ilb静态库就成功了,并且我们可以在你的工程名目录下的Debug文件夹中找到该lib文件

 记住该目录,下面操作还需要用到此目录

链接静态库

由于extern的用法与静态库息息相关,所以我们这里直接举一个.cpp需要调用.c文件中的函数的extern的例子,如果你本来就是.cpp 链接 .cpp的静态库  或者 .c  链接.c的静态库,直接看设置操作,忽略extern的使用即可。

C的编译器去编译c++写的函数代码 本质是因为c++和c的编译器在对函数重命名的命名方式不同。函数名不同,在链接过程中会找不到对应函数的定义,所以会导致报。

而extern的作用就是将c++编译器以c的风格 命名函数

 我们先看看C编译器在编译函数对函数重命名的风格

这是C++编译器在编译函数对函数重命名的风格

 --------------------------------------------------------------------------------------------------------------------------------

用 extern 在 C++调用C的工程

首先我们先包含静态库的头文件

这里我教大家两种“奇特”的包头文件方式

第一种  是静态库的头文件相对 你现在所写的工程目录比较近  的用法

第二种  就是写绝对路径

然后,我们先随便调用一下 头文件中的函数并且编译

 

出现报错

 我们需要进行一些设置才能真正链接到静态库

 

 

 找到并选择之前存放.lib的Debug文件夹

应用并确认

还要设置链接器 的 输入

先去Debug文件夹复制.lib文件的全名(包括扩展名)

将.lib的全名粘贴入 附加依赖项  记住加 ;

应用->确定

 再进行运行编译,运行成功!

用 extern 在C调用C++的工程

创建静态库和链接静态库的过程和上面一样

但是 C 调用 C++ 的工程需要注意几点

1. C没有 extern的关键字,所以我们只能在C++工程的头文件使用 extern

 2.需要注意C++工程的头文件在C文件中展开时,要屏蔽 extern ,因为C没有 extern的关键字

我们可以使用预处理指令来进行屏蔽

预处理指令来控制是否使用extern "C"  ,而__cplusplus是只有cpp文件才会有的define定义

 这样一来就不存在问题了

链接跟上面是一样的设置过程

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风君子吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值