【问题标题】:Just started C++: Undefined Symbol error on Compile刚开始 C++:编译时出现未定义符号错误
【发布时间】:2009-02-08 23:36:29
【问题描述】:

情况如下:

我刚刚开始了我的第一个 C++ 课程。我对 C++ 一无所知,尽管这是 C++ 课程的介绍,但老师几乎没有教过该语言的语法,只是我们已经知道的逻辑。

现在他给了我们一个程序描述并说,“写吧,哈哈。”我理解逻辑很好,但正如我之前所说,我对 C++ 一无所知。因此,我首先用 java 编写了它(我确实知道),然后一旦我让它在 java 中工作,我就尝试将它编码为 C++。

但是现在我在编译时遇到以下错误

uxb3% g++ -o Race race.cc
Undefined                       first referenced
 symbol                             in file
main                                /usr/local/gcc-4.1.1/bin/../lib/gcc/sparc-sun-solaris2.10/4.1.1/crt1.o
ld: fatal: Symbol referencing errors. No output written to Race
collect2: ld returned 1 exit status

有人可以帮我解决这个问题吗?

这是我在 .txt 文件中的代码: http://rapidshare.com/files/195742284/race.txt.html

这里是复制粘贴:

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <string>

using namespace std;
class Race
{

        void main()
        {
                executeRace();
        }

        int randomMove()
        {
                srand(time(NULL));
                int randomInt = rand() % 100 + 1;
                return randomInt;
        }

        void executeRace()
        {
                int rabbitPosition = 1;
                int turtlePosition = 1;

                cout << "BANG!!!" << endl << "AND THEY'RE OFF!!!";

                while (rabbitPosition <=70 && turtlePosition <=70)
                {
                        printPositions(rabbitPosition, turtlePosition);

                        turtlePosition = turtleMoveSquares(turtlePosition);
                        rabbitPosition = rabbitMoveSquares(rabbitPosition);
                }

                printWinner(rabbitPosition, turtlePosition);

                tie(rabbitPosition, turtlePosition);
        }

        int turtleMoveSquares(int tPosition)
        {

                int turtleMove = randomMove();

                if(turtleMove >=1 && turtleMove <= 40)
                        tPosition = tPosition + 4;

                if(turtleMove >= 41 && turtleMove <= 50 )
                        tPosition = tPosition - 2;

                if(turtleMove >=51 && turtleMove <=100)
                        tPosition = tPosition + 2;

                if(tPosition < 1)
                        tPosition = 1;

                return tPosition;
        }


        int rabbitMoveSquares(int rabbitPosition)
        {

                int rabbitMove = randomMove();

                if(rabbitMove >=1 && rabbitMove <= 25)
                        rabbitPosition = rabbitPosition;

                if(rabbitMove >=26 && rabbitMove <= 55)
                        rabbitPosition = rabbitPosition + 10;

                if(rabbitMove >=56 && rabbitMove <=60)
                        rabbitPosition = rabbitPosition - 15;

                if(rabbitMove >=61 && rabbitMove <= 90)
                        rabbitPosition = rabbitPosition + 5;

                if(rabbitMove >=90 && rabbitMove <=100)
                        rabbitPosition = rabbitPosition - 3;

                if(rabbitPosition < 1)
                        rabbitPosition = 1;

                return rabbitPosition;
        }

        void printPositions(int rabbitPositions, int turtlePositions)
        {
                int turtleCount;
                int rabbitCount;
                int endCount;

                if(rabbitPositions == turtlePositions && rabbitPositions != 1)
                {
                        turtleCount = 1;

                        while(turtleCount < turtlePositions)
                        {
                                cout << "-";
                                turtleCount = turtleCount+1;
                        }
                        cout << "OUCH!";
                }

                else
                {
                        turtleCount = 1;
                        rabbitCount = 1;
                        endCount=1;

                        if(turtlePositions < rabbitPositions)
                        {
                                while(turtleCount < turtlePositions)
                                {
                                        cout <<  "-";
                                                turtleCount = turtleCount+1;
                                }

                                cout << "T";

                                while(rabbitCount < (rabbitPositions - turtlePositions))
                                {
                                        cout <<  "-";
                                        rabbitCount = rabbitCount+1;
                                }
                                cout << "H";

                        }

                        if(rabbitPositions < turtlePositions)
                        {
                                while(rabbitCount < rabbitPositions)
                                {
                                        cout << "-";
                                                rabbitCount = rabbitCount+1;
                                }
                                cout << "H";

                                while(turtleCount < (turtlePositions - rabbitPositions))
                                {
                                        cout << "-";
                                        turtleCount = turtleCount+1;
                                }
                                cout << "T";

                                cout << "\n";
                        }
                }
        }

        void printWinner(int rabbitPosition, int turtlePosition)
        {
                if(turtlePosition >= 70 && rabbitPosition < 70)
                {
                        cout << "TORTOISE WINS!!! YAY!!!\n";
                }
                else if(rabbitPosition >=70 && turtlePosition < 70)
                {
                        cout << "Hare wins. Yuch.\n";
                }
                else if(rabbitPosition >=70 && turtlePosition >=70)
                {
                        cout << "It's a tie\n";
                }
        }

        void tie(int turtlePosition, int rabbitPosition)
        {
                if(rabbitPosition >=70 && turtlePosition >=70)
                        executeRace();
        }
};

【问题讨论】:

    标签: c++ compilation


    【解决方案1】:

    它抱怨main 未定义,这是正确的。 C 和 C++ 需要一个名为 main独立 函数,该函数返回 int。拥有一个名为main 的方法的 是不够的;编译器只关心独立的。

    要记住的另一件事是class 类型中成员的默认可见性是私有。要么改变你的班级以使用struct——这几乎是两者之间的唯一区别——要么指定公开可见性:

    class Race {
    public:
      void main() { ... }
    };
    

    然后你可以从你的类中调用main 函数:

    int main() {
      Race race;
      race.main();
      return EXIT_SUCCESS;
    }
    

    【讨论】:

    • 默认访问级别很好。
    【解决方案2】:

    你需要一个 main() 函数来给程序一个起点:

    int main()
    {
         // whatever...
         // Maybe:
    
         Race race;
    
         race.main();
    }
    

    但是让您的许多方法成为静态方法可能是有意义的,因为它们不依赖于 Race 类的任何实例成员。

    【讨论】:

    • 如果你打算使用静态方法,我倾向于只使用函数。也许在命名空间中。
    • 你不会从我这里得到任何论据。
    【解决方案3】:

    你需要一个主函数:

    // The arguments are only needed if passing arguments to your program.
    // You could just use `int main()`.
    int main(int argc, char** argv)
    {
        Race race;
        race.executeRace();
    }
    

    左右,没有看到你的具体错误。

    【讨论】:

      【解决方案4】:

      C++ 与 Java 完全不同。例如,函数不必是类的一部分。您需要移动函数 main() 使其位于类之外。

      class Race {
        // stuff
      };
      
      int main() {
        // stuff
      }
      

      【讨论】:

        【解决方案5】:

        也许这就是你的意思

        #include <cstdlib>
        #include <ctime>
        #include <iostream>
        #include <string>
        
        using namespace std;
        
        
        
        class Race
        {
        
        public:
            void ExecuteRace()
            {
                int rabbitPosition = 1;
                int turtlePosition = 1;
        
                cout << "BANG!!!" << endl << "AND THEY'RE OFF!!!";
        
                while (rabbitPosition <=70 && turtlePosition <=70)
                {
                    printPositions(rabbitPosition, turtlePosition);
        
                    turtlePosition = turtleMoveSquares(turtlePosition);
                    rabbitPosition = rabbitMoveSquares(rabbitPosition);
                }
        
                printWinner(rabbitPosition, turtlePosition);
        
                tie(rabbitPosition, turtlePosition);
            }
        
        private:
            int randomMove()
            {
                srand(time(NULL));
                int randomInt = rand() % 100 + 1;
                return randomInt;
            }
        
        
            int turtleMoveSquares(int tPosition)
            {
        
                int turtleMove = randomMove();
        
                if(turtleMove >=1 && turtleMove <= 40)
                    tPosition = tPosition + 4;
        
                if(turtleMove >= 41 && turtleMove <= 50 )
                    tPosition = tPosition - 2;
        
                if(turtleMove >=51 && turtleMove <=100)
                    tPosition = tPosition + 2;
        
                if(tPosition < 1)
                    tPosition = 1;
        
                return tPosition;
            }
        
        
            int rabbitMoveSquares(int rabbitPosition)
            {
        
                int rabbitMove = randomMove();
        
                if(rabbitMove >=1 && rabbitMove <= 25)
                    rabbitPosition = rabbitPosition;
        
                if(rabbitMove >=26 && rabbitMove <= 55)
                    rabbitPosition = rabbitPosition + 10;
        
                if(rabbitMove >=56 && rabbitMove <=60)
                    rabbitPosition = rabbitPosition - 15;
        
                if(rabbitMove >=61 && rabbitMove <= 90)
                    rabbitPosition = rabbitPosition + 5;
        
                if(rabbitMove >=90 && rabbitMove <=100)
                    rabbitPosition = rabbitPosition - 3;
        
                if(rabbitPosition < 1)
                    rabbitPosition = 1;
        
                return rabbitPosition;
            }
        
            void printPositions(int rabbitPositions, int turtlePositions)
            {
                int turtleCount;
                int rabbitCount;
                int endCount;
        
                if(rabbitPositions == turtlePositions && rabbitPositions != 1)
                {
                    turtleCount = 1;
        
                    while(turtleCount < turtlePositions)
                    {
                        cout << "-";
                        turtleCount = turtleCount+1;
                    }
                    cout << "OUCH!";
                }
        
                else
                {
                    turtleCount = 1;
                    rabbitCount = 1;
                    endCount=1;
        
                    if(turtlePositions < rabbitPositions)
                    {
                        while(turtleCount < turtlePositions)
                        {
                            cout <<  "-";
                            turtleCount = turtleCount+1;
                        }
        
                        cout << "T";
        
                        while(rabbitCount < (rabbitPositions - turtlePositions))
                        {
                            cout <<  "-";
                            rabbitCount = rabbitCount+1;
                        }
                        cout << "H";
        
                    }
        
                    if(rabbitPositions < turtlePositions)
                    {
                        while(rabbitCount < rabbitPositions)
                        {
                            cout << "-";
                            rabbitCount = rabbitCount+1;
                        }
                        cout << "H";
        
                        while(turtleCount < (turtlePositions - rabbitPositions))
                        {
                            cout << "-";
                            turtleCount = turtleCount+1;
                        }
                        cout << "T";
        
                        cout << "\n";
                    }
                }
            }
        
            void printWinner(int rabbitPosition, int turtlePosition)
            {
                if(turtlePosition >= 70 && rabbitPosition < 70)
                {
                    cout << "TORTOISE WINS!!! YAY!!!\n";
                }
                else if(rabbitPosition >=70 && turtlePosition < 70)
                {
                    cout << "Hare wins. Yuch.\n";
                }
                else if(rabbitPosition >=70 && turtlePosition >=70)
                {
                    cout << "It's a tie\n";
                }
            }
        
            void tie(int turtlePosition, int rabbitPosition)
            {
                if(rabbitPosition >=70 && turtlePosition >=70)
                    ExecuteRace();
            }
        };
        
        
        void main()
        {
            Race race;
            race.ExecuteRace();
        }
        

        【讨论】:

        • 函数 main 总是返回 int,从不为 void。把它当作陈词滥调的人会因此评判你,你的程序会有未定义的行为。
        • “把它当作陈词滥调的人”哈哈哈好。我只是使用与 OP 相同的代码,以便他知道去哪里。
        【解决方案6】:

        你没有主函数。

        C++与Java最大的不同在于它的main()函数有这样的签名(参数可选):

        int main(int argc, char** argv);
        

        而且它在全局命名空间中。这是程序启动时调用的函数,可能是您缺少符号的原因。

        尝试将其添加到您的程序中:

        int main() {
            Race r;
            r.main();
            return 0;
        }
        

        或者,您可以完全取消该类,因为您实际上并没有对它做任何事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-07
          • 2022-11-26
          • 1970-01-01
          • 2013-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多