【问题标题】:What causes the "Undefined symbols for architecture x86_64" Build Error?是什么导致“架构 x86_64 的未定义符号”构建错误?
【发布时间】:2012-03-14 18:18:24
【问题描述】:

这是我一直在研究的一个程序的摘录。我怀疑问题可能是由 Player 类的这个成员引起的:

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

我非常有信心这个错误与静态向量有关,因为那是我添加的最后一段代码。我的研究表明许多不同的问题会导致类似的错误,但它们似乎都与我拥有的相同类型的代码无关。

代码:(我已经删除了几行似乎不适用的代码。这应该是最低限度的。)

#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;
}

所以有人可以告诉我,我的代码有什么问题以及原因。顺便说一句,如果有人想知道这构成了一种自制桥模拟器的大部分内容。

【问题讨论】:

  • /Users/andvik/MockUp/fudge/fudge.txt 里面有什么?它包含g++ 的参数可能顺序错误或丢失。并且在错误之后添加-L.,你应该把-L.放在@/Users/andvik/MockUp/fudge/fudge.txt之前
  • 这是在 MacOSX 中吗? (看起来很重要,因为您可能正在构建通用二进制文件,这将解释来自链接器的错误,指出未为某些特定架构定义某些符号)
  • 我在 OS X Lion 上运行的 IDE (CodeLite) 对编译器进行了调用。 fudge.txt 的内容就是这样:./Debug/MockUp_main.o.

标签: c++ static x86-64 build-error undefined-symbol


【解决方案1】:

原因是 lBidding 是静态的,但是您正在声明并且没有实现它。 如果你只是添加;

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

到文件末尾,一切顺利编译。

由于静态变量不是对象的一部分,而是类的一部分,因此您需要在 cpp 文件中实现它们一次,通常按照约定命名为 .cpp。将它放在 .h 文件中并不是一个好主意,因为这将在包含它的每个文件中实现它并导致(合理的)链接器错误。

【讨论】:

  • 哦,对了。我记得读过一些关于声明和实现静态变量之间区别的东西。不过,我自己永远不会得到那个。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2015-10-27
  • 2014-05-14
相关资源
最近更新 更多