VS2019静态库的创建及extern “c“的使用

一、静态库

所有库本质都是一堆目标文件的集合,库的文件当中并不包含主函数而只是包含了大量的方法以供调用,所以说动静态库本质是可执行程序的“半成品”。

静态库的作用

  • 静态库函数允许程序员把程序链接起来而不用重新编译代码
    现有A写的程序和B写的程序,如果A想用使用B写的函数实现某些功能,B就可以把自己的程序打包成静态库,A只需要链接B的静态库,把B的头文件包含上就能使用了。
  • 如果你想把自己提供的函数给别人使用,但是又想对函数的源代码进行保密,你就可以给别人提供一个静态函数库文件。
    库是一个二进制文件,别人是看不了你的源代码的

VS2019静态库的创建

静态库的创建其实比较简单,只需简单的几个步骤:

  1. 创建新项目
  2. 在项目属性 - 配置属性 - 常规 - 配置类型 里改成 静态库(lib)
    3.把你要打包成库的头文件和源文件复制一份过来(或者直接写一份)
  3. 编译获得xxx.lib文件,就是静态库文件了

1.创建空项目
在这里插入图片描述
2.配置修改为静态库
在这里插入图片描述

在这里插入图片描述
3.添加头文件和源文件(这里演示添加的是我写的一份栈的代码)
在这里插入图片描述

4.生成静态库文件
在这里插入图片描述
在这里插入图片描述

创建静态库时出现的一些常见错误解决

1.生成不了.lib文件

试着把平台改成32位的

在这里插入图片描述

换个方式建项目

在这里插入图片描述
在这里插入图片描述

不建议在创建项目时使用静态库项目创建

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、extern "c"的使用

如果你正在写一个C++的程序,需要调用一个用C写的程序;或者你写C程序的时候,想调用一个用C++写的程序,那么extern "c"可以帮助你实现。

为什么要有extern “c”?

都说C++兼容C,那为什么两者互相调用需要用到extern “c”?在讲C++函数重载的时候,我们说C和C++的函数在编译链接阶段生成的函数修饰名是不同的,C++程序按照C++的函数名修饰方式去找函数是找不到的。在C++调用C时,所以我们需要使用 extern “c” 来告诉C++程序调用的库是用C语言方式编译链接的库,让它使用C语言的函数名修饰方式去找,就能找到了。在C调用C++时,我们需要使用 extern “c” 来让C++的函数按照C语言的方式编译生成函数修饰名,C程序就能找到C++的函数了。

两个注意点

  • C++的静态库函数使用extern"C"时,函数名按照C的方式去修饰,所以不支持函数重载
  • C的程序不认识extern"C",只能在C++里用

调用静态库需要做的配置

想要顺利调用其他程序静态库,需要修改一些配置

  • 修改项目属性——链接器——常规——附加库目录
  • 修改项目属性——链接器——输入——附加依赖项在这里插入图片描述

1.C++调用C的实现

C++调用C的时候只需要声明extern “c” 和包含静态库函数的头文件即可

  • 包含头文件的方法
    在这里插入图片描述
    包含了头文件之后
    在这里插入图片描述
  • 使用 extern “c” 找到函数
  • 在这里插入图片描述
    在这里插入图片描述

2.C调用C++的实现

和C++调用C一样,需要包含所调用库的头文件。但C的程序不认识extern"C",只能在C++里用

  • C调用C++时extern"C"的用法

写在C++头文件里

#ifdef _cplusplus//_cplusplus是C++默认定义的标识符,如未定义则是非C++程序
extern"C"
{
#endif

	...//C++头文件里各函数的声明
	
#ifdef _cplusplus
}
#endif

在这里插入图片描述

代码的意思是:条件编译把 extern “C” 和 {} 给限制了,相当于是如果这个程序是C++的程序,那就展开 extern"C",让函数按照C的方式去编译得到C方式的函数修饰名。如果是非C++(那么它本身就是C),则不需要使用 extern"C"。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值