繁体   English   中英

多个文件使用的头文件中的struct声明会导致架构x86_64 [duplicate]的重复符号

[英]Declaration of struct in header file used by multiple files causes duplicate symbol for architecture x86_64 [duplicate]

这个问题在这里已有答案:

即使我在所有头文件中都包含了头部保护,当我创建头文件PointXYZRGBAI.h并将其包含在LidarFile.cpp和core.cpp中时,会生成错误

duplicate symbol _EIGEN_ALIGN_16 in:
    CMakeFiles/core.dir/core.cpp.o
    CMakeFiles/core.dir/LidarFile.cpp.o
ld: 1 duplicate symbol for architecture x86_64

和错误似乎抱怨的标题是

#define PCL_NO_PRECOMPILE

#ifndef POINTXYZRGBAI_H
#define POINTXYZRGBAI_H
#endif

#include <pcl/point_types.h>

struct PointXYZRGBAI{
  PCL_ADD_POINT4D;
  union{
    struct{
      float intensity;
      uint32_t rgba;
    };
    float data_c[4];
  };
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} EIGEN_ALIGN_16;

POINT_CLOUD_REGISTER_POINT_STRUCT(PointXYZRGBAI,
                                  (float, x, x)
                                  (float, y, y)
                                  (float, z, z)
                                  (float, intensity, intensity)
                                  (uint32_t, rgba, rgba)
)

inline std::ostream& operator << (std::ostream& os, const PointXYZRGBAI& p){
  os << "(" << p.x << ", " << p.y << ", " << p.z << " - " << p.intensity << " - " << p.rgba << ")";
  return (os);
}

我在头文件定义的结构中使用EIGEN_ALIGN_16进行内存对齐。 如果标题保护应该防止多个包含,为什么EIGEN_ALIGN_16是重复的符号? 谢谢你的澄清。

include guard可以防止同一个.cpp文件中的多个包含。

但是,您将它包含在多个.cpp文件中。 由于该头定义了一个对象( EIGEN_ALIGN_16 ),它将包含在两者中,然后链接器会抱怨有两个重复的定义。

标题保护可防止在单个编译单元(.o文件)中多次包含符号。 但是,您已在头文件中声明了一个实际变量,因此包含此标头的每个编译单元都将获得自己的变量副本。 在将包含该符号的多个目标文件链接在一起之前,这不是问题。 这就是ld而不是gcc报告问题的原因。

更好的方法是将变量声明放在编译单元(.c或.cpp文件之一)中,并在头文件中使用extern来引用该单个实例。

即使是高级软件开发人员也会遇到这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM