2017-06-15 226 views
5

我正在创建一个GUI来控制Ubuntu 14.04上的Qt Creator硬件。我有一个类来控制摄像头(camera.h)和一个类来控制连接到USB RS232串行转换器(light.h)的光源。这个类的两个头文件分别包括制造商提供的头文件:uEye.hftdi2xx.h分别用于相机和串行转换器。如果我单独使用它们,两个库都可以完美工作然而,当我试图将它们纳入到我的mainwindow.h我获得以下错误消息(其周围14):如何解决两个库的两个头文件的冲突声明?

/home/g/Desktop/release/WinTypes.h:14: error: conflicting declaration 
    'typedef unsigned int BOOL' 
    typedef unsigned int BOOL; 

/usr/include/uEye.h:1570: error: 'BOOL' has a previous declaration as 
    'typedef int32_t BOOL' 
    typedef int32_t BOOL; 

等。我从其他帖子了解到,似乎在C++中没有简单的修复方法。任何建议如何解决(除了使用不同的硬件或有两个单独的程序)?

更新:

终于让我找到一个解决办法,但它仍然没有确切的回答我的问题。我做了如下:我去了ftdi2xx.h文件并评论导致#include WinTypes.h出问题。在light.h我包括uEye.h第一(我猜这个头还包括某种WinTypes.h)。然后,我需要添加一些typedef声明,这些声明在包含ftdi2xx.h之前不被uEye.h隐藏。它的工作原理,但它不是一个非常干净和漂亮的解决方案,因为它涉及与第三方的东西搞乱。

+3

你可以包装2个库,以使两个头文件永远不会被包含在同一个翻译单元中:每个只会包含在你的包装器组件的实现中。 (我预计它会工作,但是否打不确定行为取决于2个标头冲突。) – BoBTFish

+0

您的意思是像这篇文章中显示的内容:https://stackoverflow.com/questions/6670738/is-它是一个好主意包装一个包含在一个名称空间块 – Hans

+2

Ehw,不,这是一个可怕的想法。我的意思是基本上你创建了你自己的组件,提供相同的功能,但是使用你自己的接口,这是通过使用现有的库来实现的。这可能有点麻烦,但可以让你控制什么名字被暴露(可能是隐藏一些样板的好地方)。 – BoBTFish

回答

1

一种解决方案是为适应BOOL的库定义,这样

#ifndef BOOL //if BOOL not defined yet 
#define BOOL 

另一种方式是在你的代码,包括这两个文件之后,你可以定义自己的BOOL可能导致两个没有问题其中。

#include "uEye.h" 
#undef BOOL 
#include "ftdi2xx.h" 

或者也

#include "uEye.h" 
#undef BOOL 
#include "ftdi2xx.h" 
#undef BOOL 
typedef unsigned int BOOL; 
+4

我不认为这可以工作,因为BOOL没有使用#define定义,它是在两个头文件中的typedef。 –

+0

这是行不通的,因为Xander指出那些违反例如:typedef unsigned int BOOL; – Hans

+0

您可以#undef typedef声明。它将起作用 – raullalves

-2

你可以尝试以包括不同的命名空间中的两个文件:

namespace foo { 
#include "uEye.h" 
} 

namespace bar { 
#include "ftdi2xx.h" 
} 

然后您用分别命名空间例如访问foo::BOOL

+2

如果标题包含其他库,这将会失败。可以理解的是,大多数C++的东西都包含标准库,这将会中断。更何况当你有一个非头文件库。 –

3

封装到救援: 重写您的camera.h和light.h,以便它们不包含任何相应库的标题。这是一个实现细节,应该隐藏这些类的用户。

为了达到这个目的,你可以创建真正的接口,使用PIMPL或者 - 如果可能的话 - 只是向前声明一些东西。