Win系统下配置PCL库第三步之链接库的路径(超详细)
完成了前面的所有下载以及编译的流程后,我们就需要去链接所有库的路径放在pri文件中,以供Qt直接查询对应的头文件。
1.创建.pri文件
在这个路径下打开window的指令框:
输入以下指令就会生成一个pri文件,该文件内容会有“null”。
echo "null" >1.pri //可以自己命名
首先需要链接库的头文件:这里需要修改为你的路径
我这里直接给出
INCLUDEPATH += D:/PCL/PCL/include/pcl-1.14
INCLUDEPATH += D:/PCL/PCL/3rdParty/Boost/include/boost-1_84
INCLUDEPATH += D:/PCL/PCL/3rdParty/Eigen3/include/eigen3
INCLUDEPATH += D:/PCL/PCL/3rdParty/FLANN/include
INCLUDEPATH += D:/PCL/PCL/3rdParty/OpenNI2/Include
# INCLUDEPATH += D:/PCL/PCL/3rdParty/VTK/include/vtk-9.1
INCLUDEPATH += D:/PCL/PCL/3rdParty/VTK/include/vtk-9.4
接下来是比较特殊的:同样的需要替换前面对应的路径。
win32:CONFIG(release, debug|release) {LIBS += -LD:/PCL/PCL/3rdParty/Qhull/lib/ -lqhull_r
} else:win32:CONFIG(debug, debug|release) {LIBS += -LD:/PCL/PCL/3rdParty/Qhull/lib/ -lqhull_rd
}
下面就是要链接一些lib文件夹的lib文件,这里的文件分为debug和release两个版本的,很好区分,debug后面的后缀一般都有d或者是-gd,所以这里肯定是用脚本生成,然后复制上去即可。
有了脚本就只需要将对应的lib路径复制过去,输出路径指定好,就能自动生成对应的文件。除了上面的PCL库的基础lib,还需要添加两个路径的lib文件。
Boost的lib以及VTK的lib
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import osdef scan_libs(folder):"""扫描文件夹,返回 (release_list, debug_list)规则:文件名中带有 '-gd-' 视为 Debug,其余视为 Release"""release, debug = [], []for fname in os.listdir(folder):if not fname.lower().endswith('.lib'):continuefull = os.path.join(folder, fname).replace('\\', '/')base = fname[:-4].lower() # 去掉 .libif base.endswith('-gd') or base.endswith('d'):debug.append(full)else:release.append(full)return sorted(release), sorted(debug)def generate_pri(release_libs, debug_libs, out_file):"""生成 .pri 文件内容"""content = []content.append('# Auto-generated by gen_lib_pri.py')content.append('')# Release 块content.append('win32:CONFIG(release, debug|release) {')for lib in release_libs:content.append(f' LIBS += {lib}')content.append('}')content.append('')# Debug 块content.append('else:win32:CONFIG(debug, debug|release) {')for lib in debug_libs:content.append(f' LIBS += {lib}')content.append('}')with open(out_file, 'w', encoding='utf-8') as f:f.write('\n'.join(content))def main():input_folder = r'D:\PCL\PCL\3rdParty\VTK\lib'output_file = r'C:\Users\admin\Desktop\result\Qhull.pri'if not os.path.isdir(input_folder):print('❌ Input folder does not exist.')returnrelease_libs, debug_libs = scan_libs(input_folder)generate_pri(release_libs, debug_libs, output_file)print(f'✅ Release: {len(release_libs)} 个')print(f'✅ Debug : {len(debug_libs)} 个')print(f'📦 已保存 : {output_file}')if __name__ == '__main__':main()
这个脚本只需要更改input_folder以及output_file两个
2.总体测试
1.打开Qt,创建项目
这里可以自己选择路径
2.选择qmake
这里的勾选取消
这里需要我们勾选Visual studio 的编译器,勾选第二个。
首先需要移除工程里生成的头文件目录下的mainwindow.h,之后在.Pro中添加之前链接库路径的pri文件。
#include <QApplication>
#include <QSurfaceFormat>
#include <QTimer>
#include <QVTKOpenGLStereoWidget.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkUnsignedCharArray.h>
#include <vtkSmartPointer.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVertexGlyphFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkNamedColors.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>int main(int argc, char* argv[])
{QSurfaceFormat::setDefaultFormat(QVTKOpenGLStereoWidget::defaultFormat());QApplication app(argc, argv);// Qt WidgetQVTKOpenGLStereoWidget vtkWidget;vtkWidget.resize(800, 600);// VTK 渲染器和窗口auto renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();auto renderer = vtkSmartPointer<vtkRenderer>::New();renderWindow->AddRenderer(renderer);vtkWidget.setRenderWindow(renderWindow);// 加载点云pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);if (pcl::io::loadPCDFile("D:\\PCL\\PCL\\2.pcd", *cloud) == -1)//更改自己的pcd文件{qWarning("Failed to load PCD file!");return -1;}// 转为 vtkPointsauto points = vtkSmartPointer<vtkPoints>::New();auto colors = vtkSmartPointer<vtkUnsignedCharArray>::New();colors->SetNumberOfComponents(3);for (auto& p : cloud->points){points->InsertNextPoint(p.x, p.y, p.z);unsigned char rgb[3] = {p.r, p.g, p.b};colors->InsertNextTypedTuple(rgb);}auto polyData = vtkSmartPointer<vtkPolyData>::New();polyData->SetPoints(points);polyData->GetPointData()->SetScalars(colors);auto glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();glyphFilter->SetInputData(polyData);glyphFilter->Update();auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(glyphFilter->GetOutputPort());auto actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);renderer->AddActor(actor);renderer->SetBackground(0.1, 0.2, 0.3);renderer->ResetCamera();// 刷新窗口QTimer timer;QObject::connect(&timer, &QTimer::timeout, [&]() { renderWindow->Render(); });timer.start(30);vtkWidget.show();return app.exec();
}
需要更改路径为自己的PCD文件。
正常运行的话,到这一步,环境就配置完成了。