2010-12-13 105 views
2

我有两个库在我的include路径:C++包括重新声明

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

都定义了头文件 “vec.h” 我得到了以下错误:

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

如何处理这?

+0

他们都是一样的'vec.h'?否则,你打算使用哪一个? – birryree 2010-12-13 14:25:14

+0

不,他们是不同的..我不使用他们,只是想与两个库工作? – Ben 2010-12-13 14:27:14

回答

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 

你应该有这些警卫无论你是否有两个具有相同的名字,他们通常应与一些相当随机的末端,以限制/降低他们与冲突的可能性另一个文件中的头文件。

+0

嗯,最好检查一下,“lib1/vec.h”没有声明与“lib2/vec.h”相同的警卫符号! – Skizz 2010-12-13 14:34:49

+0

@Skizz - 好点。通常他们应该以相当随机的东西结束 – 2010-12-13 14:35:50

+0

这就是为什么你应该使用'#pragma once'而不是包含守卫。由GCC和MSVC支持。 – 2010-12-13 14:40:06

1

(对不起,还不能发表评论,所以发帖为答案。)lib1/vec.h的第22行究竟是什么以及完整的错误消息是什么?它看起来像标题试图声明已经在某处以不同的方式声明的东西,甚至可能与lib2/vec.h无关。

编辑

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

+0

/usr/local/include/lib1/img.h:22:错误:使用1个模板参数重新声明 trimesh2/include/Vec.h:82:note:previous declaration'template class Vec'used 2 template parameter(s) – Ben 2010-12-13 14:33:35

+0

在代码中:Vec.h:template class Vec {and img。h:template class Vec { – Ben 2010-12-13 14:34:38

+0

另一种解决方法是将它们放入命名空间。 – UncleBens 2010-12-13 16:11:55