【问题标题】:Why is Visual Studio Trying to Link 'freeglutd.lib'?为什么 Visual Studio 试图链接“freeglutd.lib”?
【发布时间】:2015-03-17 22:33:45
【问题描述】:

我正在尝试使用 Visual Studio 2013 编译 OpenGL 程序,但出现以下错误:

错误 1 ​​错误 LNK1104:无法打开文件 'freeglutd.lib' ...

作为参考,我安装了 FreeGLUT 并配置了 VS 以在正确的目录中搜索包含文件和库文件。事实上,VS 可以很好地识别 GLUT 包含文件。我还在 Additional Dependencies 中添加了 opengl32.libfreeglut.lib

VS 为什么要寻找“freeglutd.lib”?它绝对没有在附加依赖项中列出。我可以通过将“libglut.lib”重命名为“libglutd.lib”并将前者从依赖项中删除来解决编译错误,但我只是好奇它为什么会这样。

说到附加依赖,添加 opengl32.lib 真的有必要吗?我可以在没有它的情况下编译我的(非常基本的)程序,但不止一个人说它是必需的,也许对于旧版本的 Visual Studio?

【问题讨论】:

  • 尝试在解决方案范围内搜索libglutd.lib,看看会出现什么。我怀疑您的项目 XML 文件之一略有损坏。
  • @Robert Harvey:我在整个解决方案中搜索了libglutd.libfreeglutd.lib(我想这就是你的意思),但什么也没找到。编辑:我也检查了日志文件,链接命令没有“freeglutd.lib”作为库。

标签: visual-studio freeglut


【解决方案1】:

如果您检查 freeglut_std.h (freeglut V3.0):

            /* Link with Win32 shared freeglut lib */
#           if FREEGLUT_LIB_PRAGMAS
#               ifdef NDEBUG
#                   pragma comment (lib, "freeglut.lib")
#               else
#                   pragma comment (lib, "freeglutd.lib")
#               endif
#           endif

所以如果你不定义 NDEBUG,链接器将链接到“freeglutd.lib”, 您可以通过在“PreprocessorDefinitions”中定义一个 NDEBUG 来解决这个问题。 祝你好运!

【讨论】:

    【解决方案2】:

    可能已经回答:freeglut error LNK1104

    还要检查两件事:

    • 您是在调试模式还是发布模式下构建? freeglutd.lib 末尾的 d 表明它是一个用于调试构建的库
    • 尝试从头开始创建一个新项目,在其中放入一些使用 freeGLUT 的基本可运行代码,然后查看 VS 是否正确链接。这还将验证是否由于某种原因上一个项目的项目文件已损坏(如@RobertHarvey 建议的那样)或问题出在其他地方

    【讨论】:

    • 我之前看过那个答案,不幸的是它没有帮助。我尝试了调试和发布模式。我也按照你的建议做了,并创建了一个新项目,但没有运气。
    • 嗯,很有趣。顺便说一句,我就这样结束了你的问题 - 是的,需要 opengl 作为依赖项,因为 freeGLUT 使用 OpenGL,但涵盖了它的一些复杂性(窗口创建、输入事件处理、OpenGL 内容的初始化等。你能发布你的屏幕截图吗?项目设置(链接依赖项、标头等)。OpenGL 不需要 freeGLUT,但我感觉您正在从某个地方编写 OpenGL 代码,其中使用 freeGLUT 而不是纯 OpenGL,因此依赖于 freeGLUT。
    • 我刚刚意识到我没有正确应用链接答案中的建议。我定义了那些宏after,包括GL/glut.h,这是没有意义的。我现在可以说问题在于 FREEGLUT_LIB_PRAGMAS 等于 1。更具体地说,如果它等于 1,如果 NDEBUG 未定义,GL/freeglut_std.h 将尝试链接 libglutd.lib。所以它适用于调试版本,但发布模式默认不定义 NDEBUG。 PS 在检查 glut 头文件时,如果 FREEGLUT_LIB_PRAGMAS 为 1,则为您链接 opengl32.lib
    【解决方案3】:

    嘿,伙计,我不知道您是否仍然遇到此错误,但这里有一个解决方案。几乎“freeglutd.lib”与调试有关,因此最后是“d”,所以我所做的是进入:

    属性 > C/C++ > 预处理器 > 预处理器定义 并输入 NDEBUG。然后OKApply

    它的作用是在“freeglut_std.h”中有一个用于 NDEBUG 的 ifdef,如果它已定义,则使用“freeglut.lib”,否则将使用“freeglutd.lib”。因此,通过在预处理器定义中定义它,您现在正在使用“freeglut.lib”。希望这对您有所帮助!

    【讨论】:

    • 请使用格式化工具正确编辑和格式化您的答案。句子中的代码格式为code 非常重要的单词要粗体,不太重要的单词要斜体
    【解决方案4】:

    我通过在调试模式下从生成的 CMake 解决方案编译 freeglut 和 freeglut_static 解决了这个问题 - freeglutd 是在 lib/Debug 目录中创建的。你可以把这个目录放到lib路径下就可以了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多