由于缺少.lib文件,无法引用库项目(DLL)

7
我正在尝试启动一个C++游戏引擎项目。 虽然我对dll和lib不是很了解,但我认为引擎本身应该是一个dll,并且我会有单独的dll项目,比如renderer、input等,它们将被引擎使用,而引擎dll将被游戏使用。 在demo.exe项目中,我似乎已经成功地引用了引擎项目(通过添加引用和添加附加包含目录的路径),但当我试图在引擎dll项目中添加对渲染器dll项目的引用时,我得到以下错误: “错误 LNK1104:无法打开文件'MyPath\Renderer.lib' MyPath\LINK Engine” 为什么会提到libs呢?

4个回答

10
许多DLL都配套有相应的LIB库,在链接阶段才需要使用。因此,基本上有两种类型的LIB库:
  1. 包含所有目标文件的真正静态库
  2. 仅包含链接器定义的库,这种库与DLL一起提供
因此,您需要链接此LIB文件才能使用DLL。

2
我找不到任何 .lib 文件在任何地方被创建。例如,我想将渲染器 dll 项目包含在我的引擎 dll 项目中。渲染器构建良好,并将 .dll、.ilk 和 *.pdb 输出到我的 (solution)/Debug 文件夹中。此外,我的 (solution)/Renderer/Debug 文件夹中也有一些文件,如 *.obj。我应该链接到哪里?另外,当最终需要制作安装项目时,我只需要 dll 还是链接器也需要呢? - EvilWeebl
在我的情况下,包含*.obj文件的文件夹也包含*.lib文件,但其他项目无法在那里找到它... - Mooing Duck

3
所以我解决了我的问题。由于它们是新的项目,因此尚未实施任何方法,因此没有创建库,因此没有内容可供引用...我真傻。
最后一件事,我在定义头文件的dllimport / dllexport宏时遇到了麻烦。我试图让它在导出项目时定义dllexport,但是如果我的项目有两个名称,例如“awesome engine”,那么如何实现自动创建的导出宏?我应该使用下划线来代替空格吗?
#ifdef AWESOME_ENGINE_EXPORTS // Or AWESOMEENGINE_EXPORTS?
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif

1
右键单击项目,属性,配置属性,C/C++,预处理器。将 AWESOME_ENGINE_EXPORTS(或任何您随意选择的名称)添加到 DLL 的预处理器定义列表中。这将使得宏在您的 DLL 中被定义,从而导出函数。其他人没有该宏,因此函数将被导入。 - Mooing Duck

2
一般来说,库可以以两种模式提供其APIs:
动态模式:可执行文件较小,但需要其DLLs。
静态模式:可执行文件较大,但独立。
首先,确定您希望如何使用该库,是静态还是动态?然后配置您的项目,使编译器能够找到该库的头文件。接下来,如果必要,请将LIB文件添加到您的项目中。
在您的情况下:请检查是否已将LIB文件正确添加到您的项目或makefile中。

我很高兴以动态方式完成它,这样如果我曾经发布游戏,它将随附相应的dll文件,这意味着如果需要更新和修改,它会更容易。在这种情况下,我的Renderer dll项目没有创建一个lib文件,只有一个dll、ilk和pdb文件。当我查看我的渲染器(在引擎属性的框架和引用选项卡下)的项目引用属性时,我注意到它有一个链接库依赖项设置为true的选项,如果我将其设置为false,它似乎可以构建,但这意味着什么呢? - EvilWeebl

2

通过添加引用和添加附加包含目录的路径,引擎项目在demo.exe项目中被成功引用。

有些库可以静态链接,这意味着你只需要头文件(.h/.hpp)和.lib文件。其他库可能需要动态链接,这将导致您的程序依赖于某些DLL文件,但通常您仍需要头文件才能知道这些DLL中的内容。有时候,就像您的情况一样,您需要它们全部:头文件、静态库和DLL。

头文件包含声明,定义了类的结构,声明了函数的原型等等。 静态库.lib文件)是二进制文件,包含函数、变量等的定义,需要在编译时解析,因此当它们丢失时,链接器会抱怨。 动态链接库(DLL)也是二进制文件,但它们在运行时解析,这意味着您真正需要它们的时间是在运行程序时。


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