Несмотря на то, что я включил защиту заголовков во все мои файлы заголовков, когда я создаю файл заголовка PointXYZRGBAI.h и включаю его как в LidarFile.cpp, так и core.cpp, ошибка генерируетсяОбъявление структуры в файле заголовка, используемой несколькими файлами, вызывает дубликат символа для архитектуры x86_64
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 является дублированным символом, если защитник заголовка должен предотвращать множественные включения? Спасибо за уточнение.
В дополнение к хорошим ответам ваш 'endif' должен находиться в конце файла заголовка, так как в противном случае он бесполезен. – Phil1970
Файлы заголовка обычно имеют только объявления (тип и имя, ака интерфейс). Определения (все детали реализации) обычно входят в файл реализации с суффиксом .c или .cpp. –