【问题标题】:Can't reference a library project (DLL) because .lib file is missing无法引用库项目 (DLL),因为 .lib 文件丢失
【发布时间】:2013-03-09 16:33:31
【问题描述】:

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

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

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

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

为什么提到库?

【问题讨论】:

标签: c++ visual-studio visual-c++ dll reference


【解决方案1】:

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

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

  2. 只有链接器定义的库,这种库带有 DLLs

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

【讨论】:

  • 我在任何地方都找不到任何正在创建的 .lib 文件。如果我以我想要包含在我的引擎 dll 项目中的渲染器 dll 项目为例。渲染器构建良好并将 *.dll、*.ilk 和 *.pdb 输出到我的(解决方案)/调试文件夹中。在 my(solution)/Renderer/Debug 文件夹中也有文件,例如 *.obj。我应该链接到哪里?此外,当最终涉及到制作安装项目时,我是否也只需要 dll 或链接器?
  • 在我的例子中,包含 *.obj 文件的文件夹也包含 *.lib,但是其他项目在那里找不到它...
【解决方案2】:

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

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

#ifdef AWESOME_ENGINE_EXPORTS // Or AWESOMEENGINE_EXPORTS?
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif

【讨论】:

  • 项目右键,属性,配置属性,C/C++,预处理器。将AWESOME_ENGINE_EXPORTS(或您任意选择的任何内容)添加到您的 DLL 的预处理器定义列表中。这使得宏在您的 dll 中定义,导致函数被导出。其他人都没有那个宏,所以函数会被导入。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    一般来说

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

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

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

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

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

    【讨论】:

    • 我很乐意动态地进行,这样,如果我发布了一款游戏,它将附带相应的 dll,这意味着在必要时更容易更新和修改。在这种情况下,我的 Renderer dll 项目不会创建 lib 文件,而只会创建 dll、ilk 和 pdb 文件。我刚刚注意到,在查看我的渲染器的项目引用属性(在引擎属性的框架和引用选项卡下)时,它有一个将链接库依赖项设置为 true 的选项,如果我将其设置为 false,它似乎会构建但是这意味着什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    相关资源
    最近更新 更多