我想在我的代码中的两个源文件中使用pcl::io::savePNGFile
。
我在第二个源文件中包含所需的包含
# include <pcl/io/png_io.h>
项目无法编译。
错误消息是:
/usr/include/pcl-1.7/pcl/io/png_io.h:86: multiple definition of `pcl::io::saveRgbPNGFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned char const*, int, int)'
我要将该函数包装在一个类中,以便在项目中只包含一次。但我认为这不是最好的方式。我是以错误的方式做某事吗?有更好的解决方案吗?
谢谢!
修改
最后,我实施了Q&amp; D解决方案并包装了该功能(仅适用于普通云)
cloudsaver.h
#ifndef CLOUDSAVER_H
#define CLOUDSAVER_H
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <string>
class CloudSaver
{
public:
CloudSaver();
void saveCloudToPNG(const std::string & fileName, const pcl::PointCloud<pcl::PointXYZRGBNormal>& cl );
};
#endif // CLOUDSAVER_H
cloudsaver.cpp
#include "cloudsaver.h"
# include <pcl/io/png_io.h>
CloudSaver::CloudSaver()
{
}
void CloudSaver::saveCloudToPNG(const std::string & fileName, const pcl::PointCloud<pcl::PointXYZRGBNormal>& cl )
{
pcl::io::savePNGFile<pcl::PointXYZRGBNormal>(fileName, cl );
}
但我仍然很好奇,如何正确地做到这一点。
答案 0 :(得分:3)
据我所知,有一些与png_io.h有关的问题。
我已经使用此定义更改了png_io.h文件中PCL_DEPRECATED的定义,并且每件事都变得正常。
template <typename T>
PCL_DEPRECATED (void savePNGFile (const std::string& file_name, const pcl::PointCloud<T>& cloud),
"pcl::io::savePNGFile<typename T> (file_name, cloud) is deprecated, please use a new generic "
"function pcl::io::savePNGFile (file_name, cloud, field_name) with \"rgb\" as the field name."
);
请看这个链接[https://github.com/PointCloudLibrary/pcl/pull/300]
答案 1 :(得分:0)
我猜你使用的是PCL的静态版本。
要解决此问题,您需要将这些方法声明为内联。
例如,对于PCL 1.7.1,您需要编辑此文件: PCL-PCL-1.7.1 / IO /包括/ PCL / IO / png_io.h
在这些行中,添加关键字inline:
85: inline saveRgbPNGFile(...
96: inline savePNGFile(...
107: inline savePNGFile(...
119: inline savePNGFile(...
173: inline savePNGFile(...
现在重建库,你应该能够编译而没有任何问题。