2017-06-15 11 views
5

Ubuntu 14.04でQt Creatorを使用してハードウェアを制御するためのGUIを作成しています。私はカメラ(camera.h)を制御するクラスと、USB RS232シリアルコンバータ(light.h)に接続された光源を制御するクラスを持っています。このクラスの2つのヘッダーファイルには、製造元から提供されたヘッダーが含まれています。uEye.hftdi2xx.hはそれぞれカメラとシリアルコンバーターです。両方のライブラリを別々に使用すると、両方のライブラリが完全に機能します。2つのライブラリの2つのヘッダーファイルの競合する宣言を解決するにはどうすればよいですか?

/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; 

など:私は私のmainwindow.hにそれらを含めるしようとすると、しかし、私は次のエラーメッセージ(その14の周り)を取得します。私が他の投稿から理解していることは、C++での簡単な修正がないようです。どのようにそれを解決するための提案(異なるハードウェアを使用するか、2つの別々のプログラムを使用することを除いて)?

更新:それはまだ私の質問に正確な答えはありませんが、

は、最後に私は、回避策を見つけました。私は次のように言った:私はftdi2xx.hファイルに行って、#include WinTypes.hを引き起こす問題をコメントした。 light.hには、最初にuEye.hが含まれていました(このヘッダには、ある種のWinTypes.hも含まれていると思います)。それから、で隠蔽されていなかったいくつかの不足のtypedef宣言を追加してから、ftdi2xx.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

typedef宣言を#undefできます。それは動作します – raullalves

-2

あなたは、異なる名前空間内の2つのファイルが含ましようとすることができます:あなたは、それぞれの名前空間などにアクセスする必要が

namespace foo { 
#include "uEye.h" 
} 

namespace bar { 
#include "ftdi2xx.h" 
} 

foo::BOOL

+2

ヘッダーが他のライブラリを含んでいるなら、これは悲惨に失敗します。理解できるように、ほとんどのC++には標準ライブラリが含まれており、これは壊れます。非ヘッダのみのライブラリがある場合はもちろんですが、 –

3

レスキューへのカプセル化: camera.hとlight.hに、それぞれのライブラリのヘッダーが含まれないように書き直します。これは実装の詳細です。これらのクラスのユーザーからは非表示にする必要があります。

これを実現するには、実際のインターフェイスを作成するか、PIMPLを使用するか、可能であれば、いくつかのことを宣言してください。

関連する問題