2015-10-20 50 views
0

我嘗試使用Boost庫版本1.34.1在Mac OS X 10.8.5下編譯項目時出現問題。我正在使用Xcode 4.6.3和附帶的命令行工具。這必須是OS X特定的問題,因爲項目在CentOS Linux下編譯。在OS X下提升編譯錯誤10.8.5

我在這裏問這個,希望有人在OS X開發中使用了Boost,可能會遇到類似的問題。

我附上了下面編譯器消息的摘錄。我試着用Google搜索這個錯誤,但似乎找不到滿意的答案。請讓我知道你是否可以想到一些事情,如果你需要更多的信息(例如源代碼摘錄)能夠幫助我,那麼更有可能。

非常感謝你,

最佳,

塞巴斯蒂安

g++ -DPARC -DCPPPA_EXPORT= -fPIC -fno-common -D__STDC_LIMIT_MACROS -g -fno-inline -Wpointer-arith -Wwrite-strings -Wno-deprecated -Wreturn-type -W -I/usr/local/include -O2 -I../../src/include -I../../LexBase/src -I/include -I/usr/local/include/boost-1_34_1 -I/Users/sebastiansulger/projects/xle/dev/xfr/src/../../bgdb -Idb_client -I./ -I../include -Ifacts -Irules -Ichoices -Iterms -Imatches -Idriver -Iparser -Itriples -Iprolog -Idebug -Inew_parser -o terms/TermStorage.o -c terms/TermStorage.cpp 
In file included from terms/TermStorage.cpp:9: 
In file included from terms/TermStorage.h:28: 
In file included from ./Types.h:26: 
In file included from /usr/local/include/boost-1_34_1/boost/functional/hash.hpp:10: 
/usr/local/include/boost-1_34_1/boost/functional/hash/hash.hpp:487:20: error: 
     call to 'hash_value' is ambiguous 
      return hash_value(val); 
        ^~~~~~~~~~ 
/usr/include/c++/4.2.1/ext/hashtable.h:595:16: note: in instantiation of member 
     function 'boost::hash<long long>::operator()' requested here 
     { return _M_hash(__key) % __n; } 
      ^
/usr/include/c++/4.2.1/ext/hashtable.h:587:16: note: in instantiation of member 
     function '__gnu_cxx::hashtable<std::pair<const long long, unsigned int>, 
     long long, boost::hash<long long>, std::_Select1st<std::pair<const long 
     long, unsigned int> >, std::equal_to<long long>, std::allocator<unsigned 
     int> >::_M_bkt_num_key' requested here 
     { return _M_bkt_num_key(__key, _M_buckets.size()); } 
      ^
/usr/include/c++/4.2.1/ext/hashtable.h:522:18: note: in instantiation of member 
     function '__gnu_cxx::hashtable<std::pair<const long long, unsigned int>, 
     long long, boost::hash<long long>, std::_Select1st<std::pair<const long 
     long, unsigned int> >, std::equal_to<long long>, std::allocator<unsigned 
     int> >::_M_bkt_num_key' requested here 
     size_type __n = _M_bkt_num_key(__key); 
         ^
/usr/include/c++/4.2.1/ext/hash_map:219:22: note: in instantiation of member 
     function '__gnu_cxx::hashtable<std::pair<const long long, unsigned int>, 
     long long, boost::hash<long long>, std::_Select1st<std::pair<const long 
     long, unsigned int> >, std::equal_to<long long>, std::allocator<unsigned 
     int> >::find' requested here 
     { return _M_ht.find(__key); } 
        ^
terms/TermStorage.h:97:46: note: in instantiation of member function 
     '__gnu_cxx::hash_map<long long, unsigned int, boost::hash<long long>, 
     std::equal_to<long long>, std::allocator<unsigned int> >::find' requested 
     here 
     TsHashMapIter iter = mParent->mHashMap.find(t); 
              ^
terms/TermStorage.cpp:85:47: note: in instantiation of member function 
     'powerset::xfr::TermHashStorage<long long>::hashInsert' requested here 
    uint32_t index = (uint32_t) mIntTermStorage.hashInsert(intVal); 
              ^
/usr/local/include/boost-1_34_1/boost/functional/hash/hash.hpp:105:24: note: 
     candidate function 
    inline std::size_t hash_value(int v) 
        ^
/usr/local/include/boost-1_34_1/boost/functional/hash/hash.hpp:110:24: note: 
     candidate function 
    inline std::size_t hash_value(unsigned int v) 
        ^
/usr/local/include/boost-1_34_1/boost/functional/hash/hash.hpp:115:24: note: 
     candidate function 
    inline std::size_t hash_value(long v) 
        ^
/usr/local/include/boost-1_34_1/boost/functional/hash/hash.hpp:120:24: note: 
     candidate function 
    inline std::size_t hash_value(unsigned long v) 
        ^
/usr/local/include/boost-1_34_1/boost/functional/hash/hash.hpp:229:24: note: 
     candidate function 
    inline std::size_t hash_value(float v) 
        ^
/usr/local/include/boost-1_34_1/boost/functional/hash/hash.hpp:234:24: note: 
     candidate function 
    inline std::size_t hash_value(double v) 
        ^
/usr/local/include/boost-1_34_1/boost/functional/hash/hash.hpp:239:24: note: 
     candidate function 
    inline std::size_t hash_value(long double v) 
        ^
1 error generated. 
make[1]: *** [terms/TermStorage.o] Error 1 
make: *** [build] Error 2 
Sebastian-Sulgers-MacBook-Pro:dev sebastiansulger$ 

編輯:我注意到,boost/functional/hash/hash.hpp包括以下內容:

#if defined(BOOST_HAS_LONG_LONG) && defined(_M_X64) && defined(_WIN64) 
    // On 64-bit windows std::size_t is a typedef for unsigned long long, which 
    // isn't due to be supported until Boost 1.35. So add support here. 
    // (Technically, Boost.Hash isn't actually documented as supporting 
    // std::size_t. But it would be pretty silly not to). 
    std::size_t hash_value(long long); 
    std::size_t hash_value(unsigned long long); 
#endif 

如此看來,在類型的定義在那裏,但不適用於我的系統。這有任何意義嗎?我可以繞過這個嗎?

回答

1

它基本上說在hash.hpp中有很多hash_value函數,但它們都不適用於散列表中的類型(顯然是long long)。

您的工具對於該類型來說太舊了,或者您沒有編譯時使用適合編譯器的-std=...參數。

+0

謝謝,博你的回答。我正在調查兩個方向。同時,在檢查boost/functional/hash/hash.hpp的內容後,我更新了原始文章。看起來好像對散列類型定義的約束與我的系統不匹配。這可能是問題嗎? –

+1

我真的不知道,最近沒有看到這些版本。 Boost 1.34並不是最新的(1.59是)。看起來像8年,25次修改可能會改變一些東西。 :-) –