【问题标题】:Multiple definition of several functions in two different .o files.在两个不同的 .o 文件中对多个函数进行多重定义。
【发布时间】:2013-03-17 06:14:59
【问题描述】:

基本上我有很多这样的错误:

    IMU/IMU.cpp.o: In function `MPU6050::dmpInitialize()':
   Projects/Arduino/libraries/IMU/MPU6050_6Axis_MotionApps20.h:281: multiple definition of `MPU6050::dmpInitialize()'  
    Quadcopter.cpp.o:Projects/Arduino/libraries/IMU/MPU6050_6Axis_MotionApps20.h:281: first defined here

但我不确定如何解决这个问题。我研究了其他几个类似的问题,但没有找到与此代码相关的任何答案。


.ino

#include <Wire.h>
#include <IMU.h> 
IMU imuController;
void setup() {
  Wire.begin();
  imuController.init();
}

IMU.h

#include "MPU6050_6Axis_MotionApps20.h"

MPU6050_6Axis_MotionApps20.h

#include "I2Cdev.h"
#include "helper_3dmath.h"
#include "MPU6050.h"
#include <avr/pgmspace.h>

MPU6050.h

#include "I2Cdev.h"
#include <avr/pgmspace.h>

【问题讨论】:

标签: c++ arduino


【解决方案1】:

这可能是因为您的头文件被多次包含。你可以做的是这样定义守卫:

#ifndef SOMEVAR - *make sure the file is included only once in the current scope*
#define SOMEVAR
//Symbol definitions
#endif

如果您的编译器支持,您也可以在头文件中包含一次#pragma。

【讨论】:

  • Arduino 使用 GCC 的 C++ 编译器
  • 哪个文件的头文件? SOMEVAR 是带有扩展名的 .h 文件的名称吗?
  • 符号包含多次的文件的标题(在您的情况下,我猜它是 I2CDev.h")。并且 SOMEVAR 是您选择的任意名称。最好将其称为类似于包含文件或您定义的函数以避免混淆。
  • @leppie:尽管我不是它的粉丝,只是因为标准不保证它,但 pragma once 在 GCC 上可用。
  • 更改后您是否进行了干净的构建?有时 *.o 文件可能由于编译器工具集的不正确清理而无法重新生成。如果发生这种情况,那么我宁愿手动删除 *.o 文件并重新构建!
【解决方案2】:

正如 W.B 建议的那样,您定义的每个头文件都需要 include guard。

类似的东西 例如:Header.h

   #ifndef HEADER_H
   #define HEADER_H
   // Header stuff in here...  
   #endif

【讨论】:

  • 谢谢。如果我将库 A 和 B 导入到我的 ino 文件中,A 是否可以使用 B 中的函数和类,反之亦然?
  • 您的 ino 文件可以调用从 lib 导出的 API。我们并不担心某些 libA 函数是否调用 libB 函数,因为这将是 libA 函数的实现细节。像这样的库是提供某些功能的黑盒。如果存在任何依赖项,那么 libA 供应商应确保其所有依赖项(其他库、资源等)与最终用户的 libA 一起提供。
【解决方案3】:

这已经晚了 7 年,但这就是我所做的

  1. 在我自己的mpu_sensor.h 文件中,我只包含了
#ifndef MPU_SENSOR_H
#define MPU_SENSOR_H

#include "MPU6050.h"
#include "helper_3dmath.h"
....
#endif

请注意,我不MPU6050_6Axis_MotionApps20,因为大多数数据类型都是

  1. 在我的 mpu_sensor.cpp 文件中,这是我的包含:
#include "MPU6050_6Axis_MotionApps20.h"
#include "mpu_sensor.h"

请注意MPU6050_6Axis_MotionApps20.h必须在我包含我自己的头文件之前。

现在可以了。 我同意图书馆本身应该更新,但似乎作者在过去几年没有更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多