关于静态库和动态链接库

3
据我理解,dll文件是在运行时动态加载的,而静态库(.lib文件)则是在链接时加载的。我还了解到,.lib文件有两种类型。一种是静态.lib文件,意味着在链接时这些文件将与我编写的代码链接。另一种类型的.lib文件仅是导入文件,它只告诉链接器.dll文件的路径,这些文件可能位于system32或sysWoW64文件夹中。我的理解正确吗?
现在我对整个.lib和.dll文件系统的工作方式有一些疑问。
我编译了freeglut库,在lib文件夹中有3个重要文件。freeglut.lib、freeglut-static.lib和freeglut.dll。 我认为freeglut.lib是一个导入库,因为它只有36KB大小。 我也认为freeglut-static.lib是一个静态库,大小约为2MB。
我可以通过将freeglut.lib放置在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib和freeglut.dll放置在sysWoW64文件夹中使我的代码工作。这对我有效,并且我理解这是最有效的方法。
当我尝试使用freeglut-static.lib时,它不能编译。我将freeglut-static.lib放在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib(我从这里删除了freeglut.lib),并在项目属性>链接器>输入>附加依赖项中添加了freeglut-static.lib。然而,Visual Studio一直显示:
'LINK : fatal error LNK1104: cannot open file 'freeglut.lib'

为什么会这样呢?这只是学习库的尝试,我可以继续使用第一种方法。有人可以给出见解吗?我错过了什么吗?


当您想要使用freeglut-static.lib时,必须删除旧的链接命令,该命令引用了freeglut.lib。错误消息似乎表明您正在尝试链接两者。 - ScottMcP-MVP
@ScottMcP-MVP 我正在这样做。我正在从链接器选项中删除 freeglut.lib,只添加 freeglut-static.lib,并且我正在从 lib 目录中删除 freeglut.lib。但错误仍然存在。 - sandeep p
1个回答

1
我认为头文件会尝试使用freeglut.lib,不管怎样,你需要指定你想要使用静态版本。
#define FREEGLUT_STATIC

(与GLUT同理)
这里有一篇博客文章,恰好谈到了相同的问题:http://mattfife.com/?p=226

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接