链接静态库会导致链接库中出现错误

Linking a static library causes errors in the linked library

本文关键字:链接 错误 静态      更新时间:2023-10-16

我有一个使用OpenGL (glfw和glow)的小库项目。现在,项目编译得很好,但是当我创建一个新项目并静态链接库项目时,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的"附加包含目录"中)。如果我只编译库项目,一切正常,但是编译整个解决方案会给我前面提到的错误。

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

构建包含多个文件的项目是一个三步的过程:

  1. 创建和编辑源文件和头文件
  2. 编译源文件(此步骤包含许多子步骤)。这一步创建所有翻译单元的目标文件
  3. 链接所有的目标文件和库,形成最终的可执行文件

类似您的问题中显示的错误在第二步中发出。与库的链接发生在完全不同的步骤中,并且通常由与编译器不同的程序完成。


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


至于你的问题,与预处理器错误,这是因为你包括一个头文件从你的静态库,而这个头文件又包括一些头文件。但是预处理器的默认搜索路径中没有二级包含的头文件,所以您需要添加它。

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

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

#ifndef SOMECLASS_H
#define SOMECLASS_H
#include "GL/glew.h"
// ...
#endif

如果你从另一个库或应用程序中包含这个头文件,编译器会打开这个文件,并且会看到它也需要打开GL/glew.h,以便能够"理解"你的类的定义。

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

关于链接器设置:如果您的辉光库也是静态构建的,您可能需要也可能不需要提供该库文件并从您的项目链接到它。这取决于您如何为自己的静态库设置链接器。

如果在这一步中遇到问题,请创建一个新问题。