提问者:小点点

21点程序中x86_64体系结构的C++未定义符号


我在用C++编程一个21点游戏,遇到了好几次这个问题,甚至我已经在谷歌上搜索过了,他们的解决方案仍然不适合我,所以我想知道哪里出了问题。

当我在Clion中编译它时,错误为:

体系结构X86_64的未定义符号:

“Blackjack::Stand()”,引用自:

main.cpp.o中的_main

ld:找不到体系结构x86_64的符号clang:错误:链接器命令失败,退出代码为%1(使用-v查看调用)

:

#include <iostream>

#include "blackjack.h"

using namespace std;

int main() {
    Blackjack bj;
    for (int i = 0; i < 11; ++i) {
        bj.dealerCards.push_back(i);
    }
    for (int i = 0; i < 10; ++i) {
        bj.playerCards.push_back(i);
    }

    bj.stand();
    return 0;
}

:

#pragma once

#include <vector>
#include <numeric>

using namespace std;

class Blackjack {

public:
    vector<int> desk; // public only for test, should be protected or private

public: // public only for test, should be protected
    vector<int> dealerCards;
    vector<int> playerCards;

public:
    int hit() {};
    void stand();
};

:

#pragma once

#include <iostream>
#include <numeric>

#include "blackjack.h"

void Blackjack::stand() {
    ......
}

共2个答案

匿名用户

在源代码文件结构中,虽然包含实现,但实际上根本没有编译它,因为编译器通常不会直接编译头文件。

您应该将重命名为,并将该文件与一起编译。

匿名用户

的定义不应在头文件中。头文件用于声明而不是定义(请参见下面的异常)。

为了理解其中的原因,我们需要学习两个新术语:

    中的是一个声明。/li> 是一个定义。/li>

在编译代码时,编译器将只读取并编译一次。cpp文件中的所有常规函数,但它将读取每个。cpp文件的中的头文件。通过分离定义和声明,我们可以确保我们的代码在程序中只存在一次。

异常-:但是,有时我们有一个小函数,我们并不真正关心它的实现是否会重复一次以上。因此,我们可以在函数定义之前使用inline并将其放在头文件上,我们也可以将其定义为一个类的一部分:

class B
{
    void foo() { std::cout << "This code will be in every place it called" << std::endl; }
};

inline bar() { std::cout << "This function too!" << std::endl;  }

为了确保它只编译一次,我们应该始终在。cpp文件中定义函数,并在头文件中声明它们。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(21点|程序|中|x86_64|体系结构|c++|未定义|符号)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?