c++ 包含重新声明

问题描述 投票:0回答:2

我的包含路径中有两个库:

/usr/local/include/lib1/
/user/include/lib2/

两者都定义了头文件“vec.h”,我收到以下错误:

/usr/local/include/lib1/vec.h:22: error: redeclared with...

如何处理?

c++ c makefile
2个回答
5
投票

你会:

#include "lib1/vec.h"
#include "lib2/vec.h"

您的 makefile 应该包含指向 lib1 和 lib2 的路径。

-I /usr/local/include /user/include

您应该确保标头周围有防护装置,以确保它们不会被声明两次。 您应该看到类似以下内容:

#ifndef MYHEADER_H_ab2592zx1__
#define MYHEADER_H_ab2592zx1__

#include ...
#include ...
class ...

#endif

无论您是否有两个同名的包含,您都应该拥有这些保护,并且它们通常应该以相当随机的内容结尾,以限制/降低它们与另一个文件中的标头保护冲突的可能性。


1
投票

(抱歉,还不能发表评论,所以发布作为答案。)lib1/vec.h 的第 22 行到底是什么以及完整的错误消息是什么?看起来标头正试图声明已经在某处以不同方式声明的内容,这甚至可能与 lib2/vec.h 无关。

编辑

所以你们有名字冲突。我不知道trimesh2/include/Vec.h属于哪个库(可能是lib2),但问题肯定是这个头文件和lib1/img.h之间存在冲突。两个库定义了两个具有相同名称 Vec 的不同类。这个问题没有解决方案,除非您拥有其中一个库的源代码并且愿意将其中一个 Vec 重命名为其他名称并重新编译它。您不能在一个程序中拥有两个具有相同名称的不同内容。

© www.soinside.com 2019 - 2024. All rights reserved.