在多个文件中包含<pcl io =“”png_io.h =“”>时链接错误</pcl>

时间:2014-01-19 09:46:41

标签: point-cloud-library

我想在我的代码中的两个源文件中使用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 );
}

但我仍然很好奇,如何正确地做到这一点。

2 个答案:

答案 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(...

现在重建库,你应该能够编译而没有任何问题。