2016-08-25 9 views
1

に表示されない、このファイルで定義されたシンボルの一つは、オブジェクト・ファイルに表示されない:シンボルが何らかの理由でオブジェクトファイル

/** 
* || File: random.cc 
* || Project: Shatter 
* || Encoding: UTF-8 
* || Author: ******** 
* 
* Copyright (C) 2016 ********** *. **** 
* All rights reserved. 
* Use by explicit written permission only. 
* 
* Changelog: 
* - Aug 24, 2016, 07:35:22 PM --- File was created by ******** 
* 
*/ 

#include <shatter/random/random.h> 

// @TODO: MOVE TO <config-build.h> 
#define _M_FEATURE_ARC4RANDOM 

#ifdef _M_FEATURE_ARC4RANDOM 
    #define RAND_SEED (arc4random()) 
    #define RAND_IMPL (rand()) 
#else 
    #include <time.h> 

    #define RAND_SEED (time(NULL)) 
    #define RAND_IMPL (rand()) 
#endif 

#define _M_RANDOM_SET_SEED (srand(RAND_SEED)); 

namespace shatter { namespace random { 
    static bool randomIsSeeded = false; 

    int random(int min, int max){ 
     if(!randomIsSeeded){ 
      _M_RANDOM_SET_SEED; 
      randomIsSeeded = true; 
     } 

     return (
      (RAND_IMPL % 
       (max - min) 
      ) + min 
     ); 
    } 

    int d(int num, int sides){ 
     int ttl = 0; 
     for(int di = 0;di < num;di++) 
      ttl += random(1, sides); 

     return ttl; 
    } 

    template <class T> 
     T randomFromSet(std::map<T, int> probs_keys){ 
      int total_prob = 0; 

      /* HERE BE DRAGONS! */ 
      typedef typename std::map<T, int>::iterator __local__iterator; 

      for(__local__iterator tprob_iter = probs_keys.begin(); 
        tprob_iter != probs_keys.end(); 
        ++tprob_iter) { 
       total_prob += tprob_iter->last; 
      } 

      int target = random(0, total_prob); 

      for(__local__iterator targp_iter = probs_keys.begin(); 
        targp_iter != probs_keys.end(); 
        ++targp_iter){ 
       if(target < targp_iter->last){ 
        return targp_iter->first; 
       } 
      } 
     } 
} } 

#undef _M_RANDOM_SET_SEED 
#undef RAND_SEED 
#undef RAND_IMPL 

shatter/random/random.h

#include <stdlib.h> 
#include <map> 

namespace shatter { namespace random { 

    /** 
    * min <= random(min, max) < max 
    */ 
    int random(int min, int max); 

    /** 
    * num <= d(num, sides) <= (num * sides) 
    */ 
    int d(int num, int sides); 

    template <class T> 
     T randomFromSet(std::map<T, int>); 
} } 

私がコンパイル上記のファイルはclang++ -g -std=c++11 -cです。なんらかの理由で、定義されたシンボルはすべてrandomFromSet()を除いてオブジェクトファイルに入れられます。

$ nm build/random/random.o 
00000000000007a0 s EH_frame0 
0000000000000050 T __ZN7shatter6random1dEii 
0000000000000000 T __ZN7shatter6random6randomEii 
0000000000000808 b __ZN7shatter6randomL14randomIsSeededE 
       U _arc4random 
       U _rand 
       U _srand 

randomFromSet()は、次の関数から呼び出されます。

void Map::randomize(std::map<TileType, int> possibilities, int x, int y, int w, int h){ 
    this->enforceBounds(&x, &y); 
    this->enforceBounds(&w, &h); 

    for(int yi = y;yi < h;yi++){ 
     for(int xi = x;xi < w;xi++){ 
      int tmp_type = shatter::random::randomFromSet<TileType>(possibilities); 

      this->tileMap[yi][xi]->type = (TileType) tmp_type; 
     } 
    } 
} 

また:全体としてコンパイルする場合:

Undefined symbols for architecture x86_64: 
    "shatter::dungeon::TileType shatter::random::randomFromSet<shatter::dungeon::TileType>(std::__1::map<shatter::dungeon::TileType, int, std::__1::less<shatter::dungeon::TileType>, std::__1::allocator<std::__1::pair<shatter::dungeon::TileType const, int> > >)", referenced from: 
    shatter::dungeon::Map::randomize(std::__1::map<shatter::dungeon::TileType, int, std::__1::less<shatter::dungeon::TileType>, std::__1::allocator<std::__1::pair<shatter::dungeon::TileType const, int> > >, int, int, int, int) in map.o 

誰かがするように私を啓発することができれば、私はそれを大幅に感謝します理由はrandomFromSetがオブジェクトファイルに表示されない理由です。

ありがとうございます。

+0

を参照してください。そして、Cタグはただで滑っ?無関係な言語のタグをスパムしないでください。 – Olaf

+0

ちょっと待ってください。テンプレートファイルをヘッダーの代わりにオブジェクトファイルに定義しましたか? –

+0

@Revolver_Ocelot:オブジェクトファイル(バイナリファイルエディタなし)で関数をどのように定義しますか?いくつかのソースファイルにある可能性があります。それは完全に有効です。 OPはエラーがない場合にエラーを表示します。 – Olaf

答えて

5

この関数はtemplateであり、呼び出し元が存在する必要があります。

template関数を呼び出す。すでに実装や定義が必要です(通常はヘッダファイルにあります)。

so: explicitly instantiate a function

+0

それが呼び出されても、 'randomFromSet'自体のエントリはありませんが、生成された特定のインスタンスのエントリが存在します。 –

+0

他のファイルから呼び出されますが、 – Xenon

+1

@ Xenonそのファイルでインスタンス化されます。 –

関連する問題