为什么我必须显式调用我的库

Why do I have to call my library explicitly?

本文关键字:调用 我的 为什么      更新时间:2023-10-16

我遵循OpenGL教程,我在最后一步,使用GLEW设置FPS计数器。我有一个问题,我不得不使用#pragma comment(lib, "glew32sd.lib")来成功地链接我的库。而对于freeglut,我不需要显式地引用它。

我的结构很简单,

 library
    dll
      freeglut.dll
      glew32d.dll
    include
      GL
        freeglut.h
        freeglut_ext.h
        freeglut_std.h
        glew.h
        glut.h
        glxew.h
        wglew.h
    lib
      freeglut.lib
      glew32d.lib
      glew32sd.lib

我已经将Visual Studio设置为包含include dir并在lib中查找其他库。将dll文件夹设置为通过构建后作业复制到输出中。我很确定它是有效的,因为到目前为止,一切都很好。

如何是Visual Studio 能够链接辉光,但它是与freeglut工作?它们在同一个目录中。我看到freeglut被链接了,因为我在链接器的输出1> Processed /DEFAULTLIB:freeglut.lib中看到了它。这两个库都是从我的电脑上编译的。

我试图将GLEW编译为静态库,所以我假设编译器不加载.dll,所以我不妨删除它。但在这两种情况下都行不通。我试过使用#define GLEW_STATIC#define GLEW_BUILD,都不能连接。

然后我偶然发现了一个关于SO的答案,发现如果我做了#pragma comment(lib, "glew32sd.lib"),它会正确加载我的库。现在我假设通过显式地告诉链接器使用这个.lib,它可以使它工作。但是为什么免费下载会自动加载呢?我没有直接引用它。

现在我的代码是工作,但我只是好奇。我是一个新的c++开发人员,静态库和动态库的概念在我的脑海中仍然太新鲜了。

您需要通过pragma或Project-> linker ->Input->Additional Dependencies区域告诉链接器您使用哪些库。

在freeglut的情况下,除非您显式地将FREEGLUT_LIB_PRAGMAS定义为0,否则将在freeglut_std.h中为您提供pragmas。如果你这样做了,你就需要通过你自己的pragmas或者在Additional Dependencies区域手动添加依赖项。

通常由您来添加所需的依赖项。根据我的经验,库很少会尝试自动执行。