Я новичок в PCL (библиотека облака точек), и я пытался создать простой код визуализации облака точек, который я нашел на их веб-сайте в Visual Studio 2019. Когда я пытался его создать, он вызывает ошибки в заголовке файлы найдены в папке PCL.
Я скачал PCL 1.6 и в него включены сторонние заголовочные файлы. Я проверил, правильно ли я включил необходимые каталоги, необходимые для сборки кода, ничего не пропало. Я не уверен, как подойти к ошибкам, так как они вызваны заголовочными файлами, включенными в библиотеку PCL. Любая помощь будет принята с благодарностью.
P.S. Я прошу прощения за длинный код и сообщение об ошибке. Я впервые публикую здесь проблему.
Ниже приведен простой код визуализации облака точек, который я нашел на веб-сайте PCl:
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
int user_data;
void
viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor(1.0, 0.5, 1.0);
pcl::PointXYZ o;
o.x = 1.0;
o.y = 0;
o.z = 0;
viewer.addSphere(o, 0.25, "sphere", 0);
std::cout << "i only run once" << std::endl;
}
void
viewerPsycho(pcl::visualization::PCLVisualizer& viewer)
{
static unsigned count = 0;
std::stringstream ss;
ss << "Once per viewer loop: " << count++;
viewer.removeShape("text", 0);
viewer.addText(ss.str(), 200, 300, "text", 0);
//FIXME: possible race condition here:
user_data++;
}
int
main()
{
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
pcl::io::loadPCDFile("my_point_cloud.pcd", *cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
//blocks until the cloud is actually rendered
viewer.showCloud(cloud);
//use the following functions to get access to the underlying more advanced/powerful
//PCLVisualizer
//This will only get called once
viewer.runOnVisualizationThreadOnce(viewerOneOff);
//This will get called once per visualization iteration
viewer.runOnVisualizationThread(viewerPsycho);
while (!viewer.wasStopped())
{
//you can also do cool processing here
//FIXME: Note that this is running in a separate thread from viewerPsycho
//and you should guard against race conditions yourself...
user_data++;
}
return 0;
}
Вот заголовочный файл из папки PCL, который вызывает ошибку:
#ifndef EIGEN_VECTORBLOCK_H
#define EIGEN_VECTORBLOCK_H
namespace Eigen {
namespace internal {
template<typename VectorType, int Size>
struct traits<VectorBlock<VectorType, Size> >
: public traits<Block<VectorType,
traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
traits<VectorType>::Flags & RowMajorBit ? Size : 1> >
{
};
}
template<typename VectorType, int Size> class VectorBlock
: public Block<VectorType,
internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1>
{
typedef Block<VectorType,
internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> Base;
enum {
IsColVector = !(internal::traits<VectorType>::Flags & RowMajorBit)
};
public:
EIGEN_DENSE_PUBLIC_INTERFACE(VectorBlock)
using Base::operator=;
EIGEN_DEVICE_FUNC
inline VectorBlock(VectorType& vector, Index start, Index size)
: Base(vector,
IsColVector ? start : 0, IsColVector ? 0 : start,
IsColVector ? size : 1, IsColVector ? 1 : size)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock);
}
EIGEN_DEVICE_FUNC
inline VectorBlock(VectorType& vector, Index start)
: Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start)
{
EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock);
}
};
} // end namespace Eigen
#endif // EIGEN_VECTORBLOCK_H
Ниже приведено сообщение об ошибке, которое я получаю, когда создаю код (я не включил несколько строк ошибок, поскольку в моем сообщении превышено количество символов):
1>------ Build started: Project: PCL_trial, Configuration: Debug x64 ------
1>PCL_trial.cpp
1>Unknown compiler version - please run the configure tests and report the results
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C2039: 'type': is not a member of '`global namespace''
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C2238: unexpected token(s) preceding ';'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C2976: 'Eigen::Eigen::internal::traits': too few template arguments
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(18): message : see declaration of 'Eigen::Eigen::internal::traits'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C2039: 'StorageKind': is not a member of 'Eigen::Eigen::internal::traits'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(18): message : see declaration of 'Eigen::Eigen::internal::traits'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C3646: 'StorageKind': unknown override specifier
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C2039: 'Index': is not a member of 'Eigen::Eigen::internal::traits'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(18): message : see declaration of 'Eigen::Eigen::internal::traits'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C3646: 'Index': unknown override specifier
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(68,1): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(75,1): error C2144: syntax error: 'Eigen::Eigen::VectorBlock<VectorType,Size>' should be preceded by ';'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(74,5): error C7525: inline variables require at least '/std:c++17'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(75,1): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(86,1): error C2144: syntax error: 'Eigen::Eigen::VectorBlock<VectorType,Size>' should be preceded by ';'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(85,5): error C7525: inline variables require at least '/std:c++17'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(86,1): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\Transpose.h(76,5): error C2976: 'Eigen::Eigen::internal::traits': too few template arguments
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(18): message : see declaration of 'Eigen::Eigen::internal::traits'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\Transpose.h(95): message : see reference to class template instantiation 'Eigen::Transpose<Derived>' being compiled
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\Transpose.h(76,5): error C2039: 'Scalar': is not a member of 'Eigen::Eigen::internal::traits'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(18): message : see declaration of 'Eigen::Eigen::internal::traits'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\Transpose.h(76,1): error C3646: 'Scalar': unknown override specifier
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\Transpose.h(76,1): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\Transpose.h(76,1): error C2039: 'NumTraits': is not a member of 'Eigen::Eigen'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\VectorBlock.h(14): message : see declaration of 'Eigen::Eigen'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\Transpose.h(76,1): error C2059: syntax error: '<'
1>C:\Program Files\PCL 1.6.0\3rdParty\Eigen\include\Eigen\src\Core\Diagonal.h(83,1): error C1003: error count exceeds 100; stopping compilation
1>Done building project "PCL_trial.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
ОБНОВЛЕНИЕ: Я скачал PCL 1.9.1 и включил его каталог в свой проект. Я также скачал Boost 1.70.0, чтобы исправить ошибку с positioning.hpp
. Моя проблема сейчас заключается в ошибке с low_level_io.h . Ниже приведена ошибка, которую я получаю при создании проекта:
1>PCL_trial.cpp
1>The use of BOOST_*_ENDIAN and BOOST_BYTE_ORDER is deprecated. Please include <boost/predef/other/endian.h> and use BOOST_ENDIAN_*_BYTE instead
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(60,16): error C2039: '_open': is not a member of '`global namespace''
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(60,21): error C3861: '_open': identifier not found
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(70,16): error C2039: '_open': is not a member of '`global namespace''
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(70,21): error C3861: '_open': identifier not found
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(80,16): error C2039: '_close': is not a member of '`global namespace''
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(80,22): error C3861: '_close': identifier not found
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(90,16): error C2039: '_lseek': is not a member of '`global namespace''
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(90,22): error C3861: '_lseek': identifier not found
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(100,16): error C2039: '_read': is not a member of '`global namespace''
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(100,21): error C3861: '_read': identifier not found
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(110,16): error C2039: '_write': is not a member of '`global namespace''
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(110,22): error C3861: '_write': identifier not found
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(120,16): error C2039: '_chsize': is not a member of '`global namespace''
1>C:\Program Files\PCL 1.9.1\include\pcl-1.9\pcl\io\low_level_io.h(120,23): error C3861: '_chsize': identifier not found
1>Done building project "PCL_trial.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Кто-нибудь знает, как это исправить? Любая помощь будет оценена.