我知道已经发布了类似的问题,但我所看到的所有问题都假设该变量存在于一个类中。我尝试了类似的事情,只是删除了类部分,但仍然得到了同样的错误:
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。
答案 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()
函数解决该错误。您需要修复项目/构建工具链。