點雲庫PCL從入門到精通常見的編譯錯誤

(1)error c4996: 'fopen': This function or variable may be unsafe

       解決方法:項目->屬性->配置屬性->C/C++ -> 預處理器 -> 預處理器定義,增加: _CRT_SECURE_NO_DEPRECATE。

       參考博文:https://blog.csdn.net/wangyang20170901/article/details/78810068

(2)...\flann\algorithms\dist.h(523): error C3861: “pop_t”: 找不到標識符

       解決方法:雙擊該行輸出直接打開dist.h頭文件;將第503行的typedef unsigned long long pop_t;移動到第480行前面。

       參考博文:https://blog.csdn.net/weixin_41991128/article/details/83864713

(3)boost\typeof\msvc\typeof_impl.hpp(125): error C2988: 不可識別的模板聲明/定義

       解決方法:可以代碼的源文件最開頭的位置加上對BOOST_TYPEOF_EMULATION的定義:  

#define BOOST_TYPEOF_EMULATION
#include <pcl\registration\icp.h>

       參考博文:https://blog.csdn.net/qq_39031960/article/details/83544928

(4)error C4996: 'pcl::SAC_SAMPLE_SIZE': This map is deprecated and is kept only to prevent breaking existing user code. Starting from PCL 1.8.0 model sample size is a protected member of the SampleConsensusModel class。

       解決方法:打開項目屬性頁>C/C++>常規>SDL檢查(設置爲否)。 

       參考博文:https://blog.csdn.net/qing101hua/article/details/70739391

(5)Failed to find match for field 'rgba'.(例子5-1)

       解決方法:用word打開pcd文件查看的類型,發現 Fields不包含RGBA。將PCL::PointXYZRGBA修改爲pcl::PointXYZ。

(6) Error:no override found for 'vtkPolyDataMapper'(例子5-1)

       解決方法:在源文件的開頭加上:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);

       參考博文:https://blog.csdn.net/zzh_AI/article/details/88861221

(7) error C2039: “camera_”: 不是“pcl::visualization::PCLVisualizer”的成員(例5-2)

       解決方法:最新的pcl已經沒有camera_成員了。所以需要替換爲:

viewer.camera_.pos[0] = pos_vector[0];
viewer.camera_.pos[1] = pos_vector[1];
viewer.camera_.pos[2] = pos_vector[2];
viewer.camera_.focal[0] = look_at_vector[0];
viewer.camera_.focal[1] = look_at_vector[1];
viewer.camera_.focal[2] = look_at_vector[2];
viewer.camera_.view[0] = up_vector[0];
viewer.camera_.view[1] = up_vector[1];
viewer.camera_.view[2] = up_vector[2];
/***將以上的代碼替換爲以下函數*****/
viewer.setCameraPosition(pos_vector[0], pos_vector[1], pos_vector[2],
		look_at_vector[0], look_at_vector[1], look_at_vector[2],
		up_vector[0], up_vector[1], up_vector[2]);

       參考博文:https://www.cnblogs.com/li-yao7758258/p/6444207.html

(8)range_image_visualization.cpp(129): error C3861: “sleep”: 找不到標識符(pcl_sleep識別不了。例5-2)

       解決方法:定位到pcl_sleep的頭文件pcl_macros.h,修改pcl_sleep的宏定義sleep(x) 爲Sleep(x),【首字母大寫】

       參考博文:https://blog.csdn.net/m0_37906001/article/details/97785515

(9)法向顯示錯誤ERROR:no override found for 'vtkActor'.(例5-3)

       解決方法:在源文件中添加:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);

       參考博文:https://blog.csdn.net/bflong/article/details/79137692

(10)“error C2653: “sensor_msgs”: 不是類或命名空間名稱”

       解決方法:在PCL1.8中將PointCloud2加入了pcl名字空間,sensor_msgs是舊的方式,不再使用。將以下代碼修改爲:

sensor_msgs::PointCloud2::Ptr cloud (new sensor_msgs::PointCloud2 ());
sensor_msgs::PointCloud2::Ptr cloud_filtered (new sensor_msgs::PointCloud2 ());
//以上兩行替換爲
pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());
pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());

       參考博文:https://blog.csdn.net/zfjBIT/article/details/92595768

(11)error C2039: “fromROSMsg”: 不是“pcl”的成員

       解決方法:

pcl::fromROSMsg(*cloud_filtered_blob, *cloud_filtered);
//將以上代碼修改爲
pcl::fromPCLPointCloud2(*cloud_filtered_blob, *cloud_filtered);

       參考博文:https://blog.csdn.net/zfjBIT/article/details/92788175

(12)error C2039: “compute”: 不是“pcl::UniformSampling<PointType>”的成員。(例8-4)

       解決方法:

//將下面的兩行替換
//uniform_sampling.compute(sampled_indices);
//pcl::copyPointCloud(*model, sampled_indices.points, *model_keypoints);
//將上面的兩行替換爲下面的一行
uniform_sampling.filter(*model_keypoints);   //濾波

       參考博文:https://www.cnblogs.com/li-yao7758258/p/6612856.html

(13)使用OpenMP報錯,“User Error 1001: argument to num_threads clause must be positive”

       解決辦法:這是由於設置的線程數必須爲正,而程序中可能沒有設置,有時候甚至環境變量中設置了,但是依然報錯,我們不妨手動設置一下,使用setNumberOfThreads()函數設置一個線程數。例如對於PCL中的一段程序:

pcl::SHOTEstimationOMP<PointType, NormalType, DescriptorType> descr_est;
descr_est.setNumberOfThreads(4);
descr_est.setRadiusSearch(descr_rad_);

descr_est.setInputCloud(model_keypoints);
descr_est.setInputNormals(model_normals);
descr_est.setSearchSurface(model);
descr_est.compute(*model_descriptors);

       參考博文:https://blog.csdn.net/lch_vison/article/details/80806454

(14)error C2589: “(”:“::”右邊的非法標記錯誤的處理

       函數模板中的std::max或者std::min與Visual C++中的全局的宏max衝突。 

       解決辦法:

       第一種辦法:設置項目屬性,在預定義處理器中添加定義NOMINMAX來禁止使用Visual C++的min/max宏定義。項目屬性——> C/C++ ——> 預處理器 ——> 預處理器定義 (此處添加預定義編譯開關   NOMINMAX)

但是visual C++中定義能自動匹配double和int,如果進行了上述設置,代碼中手動將int型的數據乘以1.0來達到double的目的。

       第二種辦法: 加上括號,與Vsual C++的min/max宏定義區分開:(std::numeric_limits<double>::max)()

       參考博文:原文鏈接:https://blog.csdn.net/martinkeith/article/details/90896584

(15)error C2440: “初始化”: 無法從“const float [3]”轉換爲“Eigen::Map<const Eigen::Vector3f,0,Eigen::Stride<0,0>>”

       解決辦法:將以下代碼替換爲:

Eigen::Map<const Eigen::Vector3f> point_a_normal = point_a.normal, point_b_normal = point_b.normal;
]//將以上代碼替換爲下面的代碼
Eigen::Map<const Eigen::Vector3f> point_a_normal = point_a.getNormalVector3fMap(), point_b_normal = point_b.getNormalVector3fMap();

(16) 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章