VS2019使用静态库和动态库(转载)

转载自:https://blog.csdn.net/weixin_54946088/article/details/148750429

作者:惊讶的猫

VS2019使用静态库

用 vs2019 新建一个 空白项目,命名为 zeus-vs

然后记得设置 Platform 为 64 位,因为之前我们编译的静态库star是 64 位的。

现在开始在 vs2019 配置 zeus 依赖的静态库。静态库是在链接阶段的 用的,所以在 Linker 那里找配置就行,肯定在那里。

果然,添加静态库在 Linker ➜ Input ➜ Additional Dependencies 里面。

上面我们配置了 静态库名称,但还要将静态库的搜索路径加上去,所以还要修一下配置,如下:

然后点击运行,可以看到zeus.c运行成功。从而可以说明,经过我们这样设置,zeus.c的运行成功的依赖了我们导进来的静态库。

至此完成。

vs2019使用动态库


现在我们的目的是:新建一个 zeus-vs2 ,里面有一个zeus.c程序;它的运行依赖于我们之前制作的动态库。我们应该怎么在vs2019中使用它呢?

==》

1.先设置 Platform 为 64 位,因为动态库是 64 位的。 然后添加 zeus.c 文件 , 其他 3 个头文件 sun.h 等也要加进去项目。

2.接着跟使用静态库的操作一样,修改以下配置 Linker ➜ Input ➜ Additional Dependencies

然后,要再加上 star.lib 导入库的搜索路径,如下:

然后 点击运行 ,就会生成 zeus-vs2.exe 文件了

但是没想到 :运行的时候会报错。如下:

这是因为 star.dll 没有拷贝到 相同目录。我们只需要把 star.dll 拷贝过来就完事了,运行的时候需要 star.dll 。

这个时候再次运行,就会成功了。

拓展
解答1
vs中使用静态库,动态库的时候,需要将静态库和动态库于执行程序放在同一个目录下吗?

==>

1.对于静态库(.lib):

不需要放在一起,只要在编译阶段配置好路径,编译器会把 .lib 文件的代码直接打包进 .exe 文件里,运行时不再需要 .lib 文件了。

2.对于动态库(.dll):

需要和 .exe 放在一起,或放在系统能找到的路径下,因为 .exe 在运行时会加载 .dll,必须能找到这个文件,否则程序运行时会报错。

类型后缀编译时用运行时是否必须存在放置要求
静态库.lib✅(参与链接)❌(运行不需要)编译时路径配置好就行
动态库.dll(+.lib✅(.lib是 import lib)✅(必须存在)通常与 .exe 放一起,或放在系统环境变量中

静态库,动态库,动态库的导入库的区分
Windows 中的 .dll是动态链接库的实际代码实现,运行时被加载。

而.lib就要分清楚是哪种类型了:

如果是 import library(一般是由 .dll 生成的),用于链接器在编译期解析函数引用。

如果是 static library,那它其实就是打包代码,编译时会链接进程序,和 .dll 无关。

静态库,动态库,动态库的导入库的使用时机
1.“静态库的制作需要先将源文件进行编译形成 .obj,再将这些 .obj 链接形成静态库。本质上就是将这些 .obj 进行打包。

2.同样的过程:动态库的制作需要先将源文件编译成 .obj 文件,再使用链接器链接形成动态库。

而动态库的导入库是在生成动态库的时候一起生成的。

注:虽生成过程的步骤和静态库差不多,但是它的本质不仅仅是打包,而是生成一个可以被独立加载运行的二进制模块。

3.对于一个需要使用到静态库 static_star.lib 的源文件 a.c;在 a.c 编译成 a.obj 之后,再和 static_star.lib 一起进行链接以生成 a.exe 文件;最后执行 a.exe 文件的时候就不用到 static_star.lib 了。因为静态库中的代码已在链接阶段拷贝进可执行文件中,即生成的 a.exe 是自足的,可以脱离 .lib 单独运行

4.对于一个需要使用到动态库 star.lib 的源文件 b.c, 在 b.c 编译成 b.o 之后,再和 star.lib(导入库) 一起链接形成 b.exe; 最后b.exe 启动时必须能找到对应的 star.dll,否则会报错(如“找不到入口点”或“找不到 DLL”),而star.lib则不再用到了
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值