【问题标题】:undefined reference error for static class member when it is defined in .cpp file在 .cpp 文件中定义静态类成员时出现未定义的引用错误
【发布时间】:2021-02-14 13:07:44
【问题描述】:

此问题可能与其他“访问静态类成员时出现未定义的引用错误”问题类似。我对它们进行了探索,我的理解是我需要在源文件中单独定义静态类成员,以便为保存数据的静态类成员创建一个对象。

我的问题是我遵循定义规则但仍然得到未定义的引用错误。

可以使用此代码重现问题:

ma​​in.cpp

#include <iostream>

#include "src/a.hpp"

int main() {
    std::cout << a::x;
    return 0;
}

src/a.hpp

class a {
public:
    static int x;
};

src/a.cpp

#include "a.hpp"

int a::x = 20;

我使用g++ main.cpp -o main 编译main.cpp。我有一个test 目录,其中包含main.cpp 和一个子目录srcsrc 包含a.hppa.cpp

如果我在头文件中定义静态变量,错误就会解决,但其他帖子建议它应该导致链接器错误。

【问题讨论】:

  • 看来您实际上并未编译或链接到 a.cpp。在头文件中定义变量是可行的,因为您只在单个源文件中包含该头文件。本质上,您将int a::x = 20; 移动到main.cpp
  • @IgorTandetnik 这是我的第一个 c++ 项目,我使用的是文本编辑器(vscode),我想我编译不正确。编译这个的正确方法是什么,你能指定吗
  • g++ main.cpp src/a.cpp -o main 应该这样做,我认为。
  • 是的,它有效,谢谢。有没有一种简洁的方法可以做到这一点,因为一个项目中可以有多个源文件在不同的目录中?
  • 此时,您不妨考虑使用构建自动化系统,例如makecmake

标签: c++ static undefined-reference


【解决方案1】:

问题出在我使用的编译命令中,g++ main.cpp -o main 无法编译 src/a.cpp。用g++ main.cpp src/a.cpp -o main编译就可以了。

【讨论】:

    猜你喜欢
    • 2014-02-17
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多