2011-12-16 52 views
0

我在一個項目中使用Qt,現在試圖包含另一個使用boost的項目。 我在qt項目文件中爲我的配置添加了no_keywords,以避免boost和Qt中存在的信號和插槽功能之間的衝突。但是現在我得到了一個編譯錯誤,這個錯誤似乎源於一個名爲「check」的函數的雙重定義。有什麼方法可以避免這種情況?混合Qt和boost導致編譯錯誤與「檢查」關鍵字

一個例子是has_postfix_operator.hpp(line 141): static :: boost :: type_traits :: yes_type check(has_operator); //當運營商存在時,首選此版本

顯然在Qt中有一個「檢查」。

我正在使用Qt4.7和提升1.48。運行MacOSX 10.6.8

回答

3

您還應該看看/usr/include/AssertMacros.h,它定義了一個名爲「check」的宏 - 這可能是您的問題的原因。

要檢查這一點,請將-d __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES = 0添加到您的編譯器標誌。 如果可行,那是你的問題。

下面是該文件的註釋:

在此之前的Mac OS X 10.6在這個文件中使用的宏名與一些用戶代碼發生衝突 ,包括Boost庫和所提出的C++ 標準的努力,這個頭部的客戶端無法通過 解決這個衝突。由於這個原因,大多數宏已被更改爲 ,因此它們的前綴爲 __並且至少包含一個大寫字母,這將緩解當前和未來的衝突。但是,爲了允許當前源代碼繼續編譯,最後使用 這個舊名稱來定義兼容性宏。這個文件末尾的頂部腳本會將 目錄中使用的所有舊宏名稱轉換爲新名稱。 建議客戶端遷移到這些新的宏,因爲他們 更新其來源,因爲未來版本的Mac OS X將刪除 舊宏定義(不帶雙下劃線前綴)。 想要在沒有舊宏定義的情況下編譯的客戶端可以在包含此文件之前將 宏__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES定義爲0。