2015-01-29 1 views
0

다음 샘플 코드는 boost1_56을 사용하는 g ++ 4.8.2를 사용하는 Linux에서 잘 작동합니다.Clang OS X 컴파일러는이 코드를 사용하지 않지만 리눅스에서는 잘 작동합니다.

ld: internal error: atom not found in symbolIndex(__ZNSt3__112__hash_tableINS_17__hash_value_typeIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN15FRUIT_TUPLES4dataEEENS_22__unordered_map_hasherIS8_SB_NS9_8key_hashELb1EEENS_21__unordered_map_equalIS8_SB_NS9_9key_equalELb1EEENS5_ISB_EEE15__insert_uniqueIRKNS_4pairIS8_SA_EEEENSL_INS_15__hash_iteratorIPNS_11__hash_nodeISB_PvEEEEbEEOT_) for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
Proces 

MAIN.CPP 파일

#include "TupleFruits.hpp" 

int main() 
{ 
    map_t fruitHash = InitializeFruitHash(); 

    std::string fruit = "BANANA"; 

    auto itr = fruitHash(fruit); 
    if (fruitHash.end() == itr) 
    { 
     std::cout << fruit << " not found in hash" << std::endl; 

     exit(1); 
    } 
} 

FruitHash.cpp 파일 :

#include "TupleFruits.hpp" 

map_t InitializeFruitHash() 
{ 
    static map_t m; 

    data dBANANA = {0, 0, 6, false}; 
    data dGRAPEFRUIT = {1, 1, 6, false}; 
    data dSTRAWBERRY = {2, 2, 6, false}; 

    m[BANANA] = dBANANA; 
    m[GRAPEFRUIT] = dGRAPEFRUIT; 
    m[STRAWBERRY] = dSTRAWBERRY; 

    return m; 
} 

그러나, 나는 그 소리를 사용하여 맥 OS X (요세미티)에서 이상한 링커 오류 포함 파일 "HashData.hpp

#ifndef HASH_DATA_HPP 
#define HASH_DATA_HPP 

#include <string> 
#include <unordered_map> 
#include <cstring> 
#include <iostream> 
#include <tuple> 

#include <boost/functional/hash.hpp> 

typedef std::string fruit_key_t; 

namespace HASH_TUPLES 
{ 
struct key_hash : public std::unary_function<fruit_key_t, std::size_t> 
{ 
    std::size_t operator()(const fruit_key_t& k) const 
    { 
     std::hash<std::string> hash_fn; 

     return hash_fn(k); 
    } 
}; 

struct key_equal : public std::binary_function<fruit_key_t, fruit_key_t, bool> 
{ 
    bool operator()(const fruit_key_t& v0, const fruit_key_t& v1) const 
    { 
     return (v0 == v1); 
    } 
}; 

struct data 
{ 
    int row; 
    int column; 
    int precision; 
    bool isRipe; 

    inline bool operator ==(data d) 
    { 
     if (d.row == row && d.column == column) 
      return true; 
     else 
      return false; 
    } 

    friend std::ostream& operator << (std::ostream& os, const data& rhs) //Overloaded operator for '<<' 
    {                  //for struct output 
     os << rhs.row << ", " 
      << rhs.column; 

     return os; 
    } 
}; 

typedef std::unordered_map<const fruit_key_t, data, key_hash, key_equal> map_t; 
//             ^this is our custom hash 

} 

template<class T> 
struct map_data_compare : public std::binary_function<typename T::value_type, 
                 typename T::mapped_type, 
                 bool> 
{ 
public: 
    bool operator() (typename T::value_type &pair, 
        typename T::mapped_type i) const 
    { 
     return pair.second == i; 
    } 
}; 

#endif 

T 그는 "TupleFruits.hpp"파일을 포함합니다.

#ifndef TUPLESFRUITS_HPP 
#define TUPLESFRUITS_HPP 

#include <boost/interprocess/containers/string.hpp> 

#include "HashData.hpp" 

using namespace HASH_TUPLES; 

map_t InitializeFruitHash(); 

static std::string BANANA = "banana"; 
static std::string GRAPEFRUIT = "grapefruit"; 
static std::string STRAWBERRY = "strawberry"; 

#endif 
+1

이것은 단지 표준 링커 오류입니다. – paulm

+0

파일을 놓친 경우 링크 단계에서 라이브러리가 누락 된 것처럼 느껴집니다. 그것이 무엇인지 알아 내지 마라! 나는 리눅스 버전에 아무것도 추가 할 필요가 없다. 링크 단계에서 가져온 유일한 것은 -rt – Ivan

+0

입니다. InitializeFruitHash는 어디에 있습니까? – paulm

답변

0

알아 냈습니다. 어떻게 든 -s (바이너리에서 모든 기호 제거) 내 Makefile에 snuck

관련 문제