undefined对静态变量的引用,没有类

时间:2017-01-12 04:12:25

标签: c++

我知道已经发布了类似的问题,但我所看到的所有问题都假设该变量存在于一个类中。我尝试了类似的事情,只是删除了类部分,但仍然得到了同样的错误:

TestController.cpp:(.text+0xd0): undefined reference to `vio::HORIZONTAL_MOTOR'

vio.h

#ifndef VIO_H
#define VIO_H
namespace vio
{
        ...
        extern TransistorTuple HORIZONTAL_MOTOR;
        extern TransistorTuple FRONT_MOTOR;
        extern TransistorTuple BACK_MOTOR;
        ...

vio.cpp

...
void vio::initialize()
{
        // Define variables
        vio::TransistorTuple HORIZONTAL_MOTOR;
        vio::TransistorTuple FRONT_MOTOR;
        vio::TransistorTuple BACK_MOTOR;
        ...
}

TestController.cpp

...
void test::moveChair()
{
        // Define variables
        vio::TransistorTuple HORIZONTAL_MOTOR;
        vio::TransistorTuple FRONT_MOTOR;
        vio::TransistorTuple BACK_MOTOR;
        ...
}

这个定义在vio.cpp中运行正常但是当我在TestController.cpp中做同样的事情时,它会给出一个错误。我在TestController中包含了vio.h。

2 个答案:

答案 0 :(得分:1)

如果成员变量是静态的,则需要为它提供 static (不在任何函数中)声明:

vio::TransistorTuple HORIZONTAL_MOTOR = (some value);

答案 1 :(得分:1)

vio.h中,您在名称空间extern中声明vio个变量。

因此,如果您希望在vio.cpp定义这些变量,则无法在vio::initialize()函数中执行此操作。

通常,vio.cpp看起来与此类似:

#include <vio.h>
namespace vio {
     TransistorTuple HORIZONTAL_MOTOR = { /* however that type is initialized */ };
     void initialize() {
         // whatever this function does when called...
     }
}

上面的代码会使HORIZONTAL_MOTOR成为所谓的initvar。 main()之前的启动代码(通常称为crt0.cpp或类似的东西,通常与编译器工具链一起提供)负责实现这一点(调用initvars的构造函数)。

现在,根据您的工具链,您可能需要修复项目配置。有时,人们会使用一些旧的C相关启动代码,这些代码会忘记&#34;忘记&#34;做初始化。但是,如果您的情况如此,则无法使用自定义initialize()函数解决该错误。您需要修复项目/构建工具链。