2014-09-22 61 views
0

我使用Visual Studio 2013与Visual micro插件为arduino板。 我有错误,当我创建一个.cpp文件,就像在下面的错误列表:在视觉微的XXXXX多重定义

编译“AeroQuad”的“超级Arduino的2560或巨型ADK” testMotor.cpp.o:在功能writeMotors()' Motors_PWM_Timer.h:multiple definition of writeMotors( )' AeroQuad.cpp.o:C:\ Users \ Adi \ Documents \ Drone \ AeroQuad_v3.2 \ libraries \ AQ_Motors \ Motors_PWM_Timer.h:127: 此处首先定义ld.exe:禁用放松:它不起作用 多重定义testMotor.cpp.o:在函数writeMotors()' Motors_PWM_Timer.h:multiple definition of motorCommand' AeroQuad.cpp.o :(.bss.motorCommand + 0x0):首先在这里定义 testMotor.cpp.o :(。data.numberOfMotors + 0x0):multiple定义 个numberOfMotors' AeroQuad.cpp.o:(.data.numberOfMotors+0x0): first defined here testMotor.cpp.o:In function commandAllMotors(int)的 ' Motors_PWM_Timer.h:的commandAllMotors(int)' AeroQuad.cpp.o:C:\Users\Adi\Documents\Drone\AeroQuad_v3.2\libraries\AQ_Motors\Motors_PWM_Timer.h:149: first defined here testMotor.cpp.o:In function initializeMotors(NB_Motors)多个定义' Motors_PWM_Timer.h:多个定义initializeMotors(NB_Motors)' AeroQuad.cpp.o:C:\Users\Adi\Documents\Drone\AeroQuad_v3.2\libraries\AQ_Motors\Motors_PWM_Timer.h:68: first defined here testMotor.cpp.o:In function的 initMotors(NB_Motors) ' testMotor.h:的initMotors(NB_Motors)' AeroQuad.cpp.o:\testMotor.h:22: first defined here testMotor.cpp.o:In function pulseMotors多个定义(无符号字符)' Motors.h:多重定义 `pulseMotors(unsigned char)' AeroQuad.cpp.o:C:\ Users \ Adi \ Documents \ Drone \ AeroQuad_v3.2 \ libraries \ AQ_Motors \ Motors.h:51: 第一次定义这里错误创建。

我不明白这是为什么?

我的头文件是这样的:

// testMotor.h 

#ifndef _TESTMOTOR_h 
#define _TESTMOTOR_h 

/*Adi*/ 
//#define MOTOR_PWM 
#define MOTOR_PWM_Timer 
//#define MOTOR_APM 
//#define MOTOR_I2C 

#define NB_MOTOR_4 
//#define NB_MOTOR_6 
//#define NB_MOTOR_8 



#if defined MOTOR_PWM_Timer 
#include <Motors_PWM_Timer.h> 


#endif 

#if defined (NB_MOTOR_4) 
#define NB_MOTOR 4 
#define NB_MOTOR_CONFIG FOUR_Motors 
#endif 

void testMotor(int motor); 
void initMotors(NB_Motors motorConfig); 
#endif 

在我testMotor.cpp文件我'包括testMotor.h文件。就像下面的代码:

#include "testMotor.h" 

void testMotor(int motor) { 

    for (int motorTrust = 1000; motorTrust < 1400; motorTrust += 10) { 
     motorCommand[motor] = motorTrust; 
     writeMotors(); 
     delay(200); 
    } 

    motorCommand[motor] = 1000; 
    writeMotors(); 
} 

void initMotors(NB_Motors motorConfig) { 
    initializeMotors(motorConfig); 
} 

我还包括testMotor.h文件在我.ino项目。就像下面的代码:

#include "testMotor.h" 
#include "Motors.h" 
#include <EEPROM.h> 
#include <Wire.h> 
#include <GlobalDefined.h> 
#include "AeroQuad.h" 
#include "PID.h" 
#include <AQMath.h> 
#include <FourtOrderFilter.h> 

我的解决方案的项目显示在下面的图片:

enter image description here

事实是,当我从它运行没有错误的项目排除testMotor.cpp

原因可能是视觉微不使用C++编译器,但C编译器?比我要更改编译器到C?

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

+0

试着在头文件中保留*声明*并在'.cpp'文件中保留*定义*。 – Biffen 2014-09-22 12:32:22

+0

那么你在头文件中定义*'initMotors',所以每个源文件([* translation unit *](http://en.wikipedia.org/wiki/Translation_unit_%28programming%29))包含头文件将被定义。 – 2014-09-22 12:32:46

+0

现在你可以声明'initMotors'是'inline'来解决这个问题,但是一般情况下,正如其他人所说的,你应该把函数定义放在你的.c/.cpp文件中。 – 2014-09-22 12:38:11

回答

0

这看起来像一个叫做Motors_PWM_Timer.h库试图定义你还限定你testMotor.h功能

更多信息

当Visual微编译它应该做的Arduino的IDE这意味着Visual Studio项目不被使用。 Arduino IDE只能查看磁盘上的实际源文件,因此这就是Arduino和Visual Micro中编译的内容。

Visual Micro使用与Arduino IDE相同的工具链。

Visual Studio项目纯粹是为了便于使用和提供智能感知。

对于Visual Micro帮助最好的地方是在专用的forum

谢谢