我有一个使用OpenGL(glfw和glew)的小型库项目。现在,项目编译得很好,但是当我创建一个新项目并静态链接库项目时,VS开始在库项目中抛出错误。那是为什么?
更具体地说,我收到了这个错误:
error C1083: Cannot open include file 'GL/glew.h': No such file or directory (file: trenums3d.h)
项目设置如下:库项目'Foo',编译成静态库('Foo.lib')。应用程序项目“Bar”链接'Foo'(我添加了Foo.lib驻留在Bar的'其他库目录'的文件夹,以及'Foo'的源文件夹到Bar的'其他包含目录')。如果我只编译库项目,一切正常,但编译整个解决方案会给我上述错误。
答案 0 :(得分:2)
这不是您问题的正确答案,而只是解释以编译语言构建应用程序所需的步骤。
构建包含多个文件的项目分为三个步骤:
在第二步中发出问题中显示的错误。与库的链接发生在完全不同的步骤中,通常由与编译器不同的程序完成。
要回答您的问题,如果与静态库链接还需要与静态库所依赖的其他库链接,那么答案通常是肯定的。静态库只包含实际库中的函数,您可以将静态库更多地视为对象文件的集合或归档。静态库不包含有关它们所依赖的其他库的任何信息。
至于你的问题,由于你在预处理器错误中包含了静态库中的头文件,而该头文件又包含一些头文件。但预处理器在其默认搜索路径中没有包含辅助头文件,因此您需要添加它。
这仍然与链接任何库无关,这是一个纯粹的预处理器问题,并在上面的列表中的第二步处理。
答案 1 :(得分:1)
我怀疑静态库的头文件看起来有点像这样:
#ifndef SOMECLASS_H
#define SOMECLASS_H
#include "GL/glew.h"
// ...
#endif
如果您从其他库或应用程序中包含此头文件,编译器将打开此文件并将看到它还需要打开GL/glew.h
以便能够“理解”您的类的定义
这意味着您至少需要提供glew的头文件。摆脱这种情况的唯一方法是,如果您设法仅引用.cpp
文件中的glew文件,而不是.h
文件中的glew文件。在某些情况下,可以使用前向声明,但不确定这是否适用于glew。
关于链接器设置:如果您的glew库也是静态构建的,您可能也可能不必提供该库文件并从项目链接到它。这取决于您为自己的静态库设置链接器的方式。如果您在此步骤中遇到问题,请创建一个新问题。