链接静态库会导致链接库中的错误

时间:2014-08-12 07:14:16

标签: c++ opengl static-linking glew

我有一个使用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的'其他包含目录')。如果我只编译库项目,一切正常,但编译整个解决方案会给我上述错误。

2 个答案:

答案 0 :(得分:2)

这不是您问题的正确答案,而只是解释以编译语言构建应用程序所需的步骤。

构建包含多个文件的项目分为三个步骤:

  1. 创建和编辑源文件和头文件
  2. 源文件的编译(此步骤包含many sub-steps)。此步骤创建所有translation units
  3. 的目标文件
  4. 链接所有目标文件和库以形成最终的可执行文件
  5. 在第二步中发出问题中显示的错误。与库的链接发生在完全不同的步骤中,通常由与编译器不同的程序完成。


    要回答您的问题,如果与静态库链接还需要与静态库所依赖的其他库链接,那么答案通常是肯定的。静态库只包含实际库中的函数,您可以将静态库更多地视为对象文件的集合或归档。静态库不包含有关它们所依赖的其他库的任何信息。


    至于你的问题,由于你在预处理器错误中包含了静态库中的头文件,而该头文件又包含一些头文件。但预处理器在其默认搜索路径中没有包含辅助头文件,因此您需要添加它。

    这仍然与链接任何库无关,这是一个纯粹的预处理器问题,并在上​​面的列表中的第二步处理。

答案 1 :(得分:1)

我怀疑静态库的头文件看起来有点像这样:

#ifndef SOMECLASS_H
#define SOMECLASS_H

#include "GL/glew.h"

// ...

#endif

如果您从其他库或应用程序中包含此头文件,编译器将打开此文件并将看到它还需要打开GL/glew.h以便能够“理解”您的类的定义

这意味着您至少需要提供glew的头文件。摆脱这种情况的唯一方法是,如果您设法仅引用.cpp文件中的glew文件,而不是.h文件中的glew文件。在某些情况下,可以使用前向声明,但不确定这是否适用于glew。

关于链接器设置:如果您的glew库也是静态构建的,您可能也可能不必提供该库文件并从项目链接到它。这取决于您为自己的静态库设置链接器的方式。如果您在此步骤中遇到问题,请创建一个新问题。