2014-10-07 88 views
0

所以,我建提升具有以下script方便發表toma錯誤信息10.9 Xcode6

並將其編譯,我可以在Xcode6各自的框架添加到我的iOS目標和我的OSX目標。

它正常運行在iOS上,但是當我嘗試編譯在OSX我得到has_binary_operator.hpp錯誤下面幾行:

template < typename Lhs, typename Rhs > 
struct operator_exists { 
    static ::boost::type_traits::yes_type check(has_operator); // this version is preferred when operator exists 
    static ::boost::type_traits::no_type check(no_operator); // this version is used otherwise 

    BOOST_STATIC_CONSTANT(bool, value = (sizeof(check(((make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type))); 
}; 

錯誤消息: .../boost.framework /頭/ type_traits/detail/has_binary_operator.hpp:155:42:預期的成員名稱或';'聲明說明符後 .../boost.framework/Headers/type_traits/detail/has_binary_operator.hpp:156:41:預期的成員名稱或';'聲明說明符後

截圖: Screenshot

PS:我是STDLIB的libC++,我想用C++ 11鏘在iOS和MacOSX的。我的意思是它適用於iOS,所以爲什麼它不適用於MacOSX目標?!?

Quickfix: 未定義'check'似乎解決了錯誤,因爲這似乎是在MacOSX上保留的關鍵字。仍然這似乎是一個奇怪的解決方案,只是取消定義一個OSX關鍵字,這不會導致後來的問題?

#undef check 
#include <boost/multi_array.hpp> 

回答

3

check不是一個關鍵字,而是Apple提供的文件中一個不幸命名的宏。

多年來,這一直是一個促進(和其他圖書館供應商)的問題。

頭文件<AssertMacros.h>是定義這個宏的地方。

查看https://svn.boost.org/trac/boost/ticket/2115有關這方面的一些歷史記錄。

該文件(即蘋果附帶的10.9 SDK)包含以下文本的最新版本:

  • 在此之前的Mac OS X衝突與一些
  • 用戶在該文件中使用10.6的宏名代碼,包括庫中的推動和建議的C++標準努力,
  • 並且這個頭的客戶端沒有辦法解決這個衝突。由於這種
  • ,大部分的宏已被更改,以便它們與
  • __前綴,幷包含至少一個大寫字母,這應該減輕目前
  • 和未來的衝突。但是,爲了允許當前源繼續編譯,最後使用舊名稱定義兼容性宏。頂部腳本
  • 在該文件的末尾將把目錄
  • 中使用的所有舊宏名稱轉換爲新名稱。建議客戶遷移到這些新宏,因爲未來的Mac OS X版本將刪除舊的宏定義(不帶雙下劃線前綴),因此他們更新其源,因爲它們將更新其源。客戶誰
  • 要編譯不老宏定義此文件之前定義宏
  • __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0是
  • 包括在內。

因此,您可以將-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0添加到您的構建命令來解決此問題。

或者,您可以獲得更新版本的增強版,其中這些調用已從check更名爲s_check

+0

謝謝,我在Build Settings下添加了「Other C++ Flags」的makro,它在刪除「uncheck」行後仍然有效。 不想重新編譯一個較新的boost(我目前使用1.55),花了足夠長的時間纔得到一個iOS和OSX的工作。 – Bersaelor 2014-10-07 14:05:38