参见英文答案 > duplicate symbol error C++ 4个
即使我在所有头文件中都包含了头部保护,当我创建头文件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是重复的符号?谢谢你的澄清.
解决方法:
标题保护可防止在单个编译单元(.o文件)中多次包含符号.但是,您已在头文件中声明了一个实际变量,因此包含此标头的每个编译单元都将获得自己的变量副本.在将包含该符号的多个目标文件链接在一起之前,这不是问题.这就是ld而不是gcc报告问题的原因.
更好的方法是将变量声明放在编译单元(.c或.cpp文件之一)中,并在头文件中使用extern来引用该单个实例.
即使是高级软件开发人员也会遇到这个问题.