为什么我必须明确地调用我的库?

时间:2014-08-02 03:58:40

标签: c++ opengl visual-studio-2013 glew

我跟随OpenGL tutorial和我在最后一步,使用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文件夹设置为通过构建后作业复制到输出。我很确定它有效,因为到目前为止,freeglut的一切都很好。只有glew没有工作。

Visual Studio 如何无法链接glew但是它正在使用freeglut?它们位于同一目录中。我看到freeglut正在链接,因为我在链接器的输出1> Processed /DEFAULTLIB:freeglut.lib中看到了它。两个库都是从我的计算机编译的。

我尝试将GLEW编译为静态库,所以我假设编译器没有加载.dll所以我不妨删除它。但在这两种情况下它都不会起作用。我尝试使用#define GLEW_STATIC#define GLEW_BUILD,也不会链接。

然后我偶然发现了SO的答案,发现如果我#pragma comment(lib, "glew32sd.lib")它会正确加载我的库。现在我假设通过明确地告诉链接器使用这个.lib它使它工作。但是为什么freeglut会自动加载?我没有在任何地方直接引用它。

现在我的代码正在运行,但我只是好奇。我是一名新的C ++开发人员,静态库和动态库的概念在我看来仍然太新鲜。

1 个答案:

答案 0 :(得分:1)

您需要通过编译指示或项目属性的Project-> Linker-> Input-> Additional Dependencies区域告诉链接器您使用哪些库。

对于freeglut,在freeglut_std.h中为您提供了pragma,除非您明确将FREEGLUT_LIB_PRAGMAS定义为0。如果您这样做,则需要通过自己的pragma或Additional Dependencies区域手动添加依赖项。

通常,您需要添加所需的依赖项。根据我的经验,图书馆很少尝试自动完成。