为啥我必须显式调用我的库?

Posted

技术标签:

【中文标题】为啥我必须显式调用我的库?【英文标题】:Why do I have to call my library explicitly?为什么我必须显式调用我的库? 【发布时间】:2014-08-02 03:58:40 【问题描述】:

我正在关注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\ 目录并在 lib 中查找其他库。 dll 文件夹设置为通过构建后作业复制到输出。我很确定它有效,因为到目前为止,freeglut 一切都很好。只有 glew 不起作用。

Visual Studio not 如何能够链接 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】:

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

在 freeglut 的情况下,除非您将FREEGLUT_LIB_PRAGMAS 明确定义为0,否则会在freeglut_std.h 中为您提供编译指示。如果您这样做了,则需要通过您自己的编译指示或在 Additional Dependencies 区域中手动添加依赖项。

一般情况下,您可以自行添加所需的依赖项。根据我的经验,图书馆很少尝试自动执行此操作。

【讨论】:

天哪,那是一个艰难的过程。我很高兴我的方法没有 100% 错误。感谢您的帮助!

以上是关于为啥我必须显式调用我的库?的主要内容,如果未能解决你的问题,请参考以下文章

为啥尝试使用显式类型参数调用模板成员函数时会出错?

为啥要显式调用 asyncio.StreamWriter.drain?

为啥我们需要显式调用 zero_grad()? [复制]

为啥代码会通过空指针显式调用静态方法?

爪哇。隐式超级构造函数 Employee() 未定义。必须显式调用另一个构造函数[重复]

核心数据:为啥必须调用重新加载数据才能使我的应用程序正常工作?