2017-06-15 227 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或者 - 如果可能的話 - 只是向前聲明一些東西。