2012-03-14 29 views
2

これは私が取り組んでいるプログラムの抜粋です。私はこの問題はshomehowクラス選手のこのメンバーによって引き起こされると思われる。(解決済み)「アーキテクチャx86_64の未定義シンボル」ビルドエラーの原因

std::vector<std::list<Bid> > lBidding 

フォロービルドエラーのコードの結果:

g++ -o ./Debug/fudge @"/Users/andvik/MockUp/fudge/fudge.txt"-L. 
Undefined symbols for architecture x86_64: 
"Player::lBidding", referenced from: 
    Deal::bidding()  in MockUp_main.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
make[1]: *** [Debug/fudge] Error 1 
make[1]: Leaving directory `/Users/andvik/MockUp/fudge' 
make: *** [All] Error 2 
make: Leaving directory `/Users/andvik/MockUp' 
----------Build Ended---------- 
0 errors, 0 warnings 

を、私はこのエラーは何かにを持っていることはかなり自信それは静的なベクトルと私は追加したコードの最後の部分だったので。私の研究は、似たようなエラーを引き起こす多くの異なる問題を示していますが、それらのどれも私が持っているのと同じ種類のコードに関係しているようには見えません。

コード:(。私はこれが最低限でなければなりません離れて適用されていないようだコードのいくつかのhudredラインをトリミングしました。)

#include <string> 
#include <list> 
#include <vector> 

class Bid 
{ 
public: 
short iLevel; 
short iSuit; 
Bid():iLevel(0),iSuit(0){}; 
Bid(short l, short s):iLevel(l),iSuit(s){}; 
bool operator ==(const Bid Other) const 
{ 
    if(iLevel==Other.iLevel && iSuit==Other.iSuit) 
    {return 1;} 
    else{return 0;} 
} 
}; 
class Player 
{ 
public: 
short iPos; 
static std::vector<std::list<Bid> > lBidding; 
Player(short p):iPos(p) {}; 

bool operator ==(const Player Other) const 
{ 
    if(iPos == Other.iPos){return 1;} 
    else{return 0; 
    } 
} 
}; 
class Deal 
{ 
public: 
short iPass; 
short iIteration; 
Player pWest, pNorth, pEast, pSouth, pError; 
Deal(): iPass(0), iIteration(0), pWest(0), pNorth(1), pEast(2), pSouth(3), pError(5){}; 
void bidding() 
{ 
    Player pTemp(5); 
    Bid bTemp, bPass; 
    while(iPass < 3) 
    { 
     pTemp = setPlayer(); 

        if(pTemp == pError){break;} 

     if(Player::lBidding.at((pTemp.iPos+2)%4).empty()){} 
     else 
     { 
      if(Player::lBidding.at(pTemp.iPos).empty()){} 
     } 
     if(bTemp == bPass){++iPass;} 
     else{(*Player::lBidding.begin()).push_back(bTemp);} 
    }; 
} 
Player setPlayer() 
{ 
    switch(iIteration % 4) 
    { 
     case 0: return pWest; break; 
     case 1: return pNorth; break; 
     case 2: return pEast; break; 
     case 3: return pSouth; break; 
    } 
    return pError; 
} 
}; 
int main(int argc, char **argv) 
{ 
srand(time(0)); 
Deal deal; 
deal.bidding(); 
printf("No debugging error.\n"); 
return 0; 
} 

だから、誰かが間違っているものを、私に言うpleseはでき私のコードと理由。 Btw、もしこれが誰かが手作りのブリッジシミュレータの一種であると思っているのであれば。

+0

'/ Users/andvik/MockUp/fudge/fudge.txt'の中には何がありますか?おそらく 'g ++'の引数が間違った順序で入っているか、見つからないことがあります。 '-L.'を間違えた後に追加すると' @/Users/andvik/MockUp/fudge/fudge.txt'の前に '-L.'を置くべきです –

+0

これはMacOSXでですか? (ユニバーサルバイナリを構築しているように見えますが、いくつかのシンボルが特定のアーキテクチャで定義されていないというリンカのエラーを説明しています) –

+0

私がOS上で実行しているIDE X Lionはそのコンパイラの呼び出しを行いました。 fudge.txtの内容はこれだけです:./Debug/MockUp_main.o。 – user1269612

答えて

6

なぜなら、lBiddingは静的ですが、あなたはが宣言されていて、を実装していないからです。 追加するだけの場合は、

std::vector<std::list<Bid> > Player::lBidding; 

ファイルの最後まで、すべてが楽しくコンパイルされます。

静的変数はクラスの代わりにオブジェクトの一部ではないので、通常は慣習として< classname> .cppという名前でcppファイルに実装する必要があります。これを.hファイルに入れるのは良い考えではありません。それはそれを含むすべてのファイルにそれを実装し、(正当な)リンカエラーを引き起こすからです。

+0

ああ、そうです。私は静的変数の宣言と実装の違いについて、何かを読んで覚えています。私は自分自身で決してそれを持っていないでしょう。本当にありがとう。 – user1269612

関連する問題