7

我正在尝试启动一个 C++ 游戏引擎项目。

我对 dll 和 lib 的了解不多,但我认为引擎本身就是一个 dll,我会有单独的 dll 项目,如渲染器、输入等,这些项目将由引擎使用,而引擎 dll 将由游戏。

我似乎在 demo.exe 项目中很好地引用了引擎项目(通过添加引用并添加到其他包含目录的路径)但是当尝试在引擎 dll 项目中添加对渲染器 dll 项目的引用时,我得到了:

错误 LNK1104:无法打开文件 'MyPath\Renderer.lib' MyPath\LINK 引擎

为什么提到库?

4

4 回答 4

10

许多 DLL 都带有相应的 LIB 库,这些库仅在链接阶段需要。所以基本上有两种类型的 LIB 库:

  1. 包含所有目标文件的真实静态库

  2. 仅包含链接器定义的库,此类库带有 DLL

所以基本上你需要链接这个 LIB 文件才能使用 DLL

于 2013-03-09T16:52:48.713 回答
3

所以我整理了我的问题。由于它们是新项目,它们还没有实现任何方法,所以没有创建库,所以没有什么可参考的……我很傻。

最后一件事,我在为头文件定义 dllimport/dllexport 宏时遇到了麻烦。我试图让它在导出项目时定义 dllexport 但说我的项目是 2 个名称,例如“很棒的引擎”,那么我如何实现显然是自动创建的导出宏?我应该在空格处使用下划线吗?

#ifdef AWESOME_ENGINE_EXPORTS // Or AWESOMEENGINE_EXPORTS?
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif
于 2013-03-09T19:52:09.860 回答
2

一般来说,

该库可能会以两种模式为您提供它的 API:

  • 动态:较小的可执行文件,但需要其 DLL。

  • 静态:较大的可执行文件,但独立。

首先,决定你想如何使用那个库,静态的还是动态的?!然后配置编译器能够找到该库的头文件的项目。然后,如果有必要,将 LIB 文件添加到您的项目中。

在您的情况下:检查您是否将 LIB 文件正确添加到您的项目或 makefile 中?

于 2013-03-09T16:48:49.887 回答
2

在 demo.exe 项目中很好地引用了引擎项目(通过添加引用并将路径添加到其他包含目录)

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

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

于 2013-03-09T16:51:57.460 回答