转载自: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则不再用到了。
5380

被折叠的 条评论
为什么被折叠?



