为啥我必须显式调用我的库?
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?