Ubuntu20.04下VTK9.0.1的安装与在Qt5.12下的案例测试和使用CMAKE的测试

前言

本文记录了在Ubuntu20.04下VTK9.0.1的安装,两种使用方式:在Qt5.12下的案例测试,单独使用CMAKE的来运行案例程序的测试。

一、Ubuntu20.04下VTK9.0.1的安装

实际上在ubuntu20.04环境下安装VTK9.0.1与VTK8.2.0差不多,CSDN上的资料很多了,我是按照这篇文章来安装的,一路畅通,不通的话再百度,ubuntu18.04安装vtk8.2.0,所以就直接指路了。但是他的最后一步,我弄了之后出了一些问题,反正也用不到,最好不要弄。

二、VTK9.0.1在QT5.12下的使用

2.1 新建一个工程

在这里插入图片描述
自己设置工程名和路径,然后点击下一步。
在这里插入图片描述
Build system先选择qmake;然后一直点下一步,直到完成。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.2 修改.pro文件

修改CSDN_Case.pro文件为:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

INCLUDEPATH += $$PWD/../../../../../usr/local/include/vtk-9.0
DEPENDPATH += $$PWD/../../../../../usr/local/include/vtk-9.0


LIBS += -L$$PWD/../../../../../usr/local/lib/ \
-lvtkChartsCore-9.0 \
-lvtkCommonColor-9.0 \
-lvtkCommonComputationalGeometry-9.0 \
-lvtkCommonCore-9.0 \
-lvtkCommonDataModel-9.0 \
-lvtkCommonExecutionModel-9.0 \
-lvtkCommonMath-9.0 \
-lvtkCommonMisc-9.0 \
-lvtkCommonSystem-9.0 \
-lvtkCommonTransforms-9.0 \
-lvtkDICOM-9.0 \
-lvtkDICOMParser-9.0 \
-lvtkDomainsChemistry-9.0 \
-lvtkdoubleconversion-9.0 \
-lvtkexodusII-9.0 \
-lvtkexpat-9.0 \
-lvtkFiltersAMR-9.0 \
-lvtkFiltersCore-9.0 \
-lvtkFiltersExtraction-9.0 \
-lvtkFiltersFlowPaths-9.0 \
-lvtkFiltersGeneral-9.0 \
-lvtkFiltersGeneric-9.0 \
-lvtkFiltersGeometry-9.0 \
-lvtkFiltersHybrid-9.0 \
-lvtkFiltersHyperTree-9.0 \
-lvtkFiltersImaging-9.0 \
-lvtkFiltersModeling-9.0 \
-lvtkFiltersParallel-9.0 \
-lvtkFiltersParallelImaging-9.0 \
-lvtkFiltersPoints-9.0 \
-lvtkFiltersProgrammable-9.0 \
-lvtkFiltersSelection-9.0 \
-lvtkFiltersSMP-9.0 \
-lvtkFiltersSources-9.0 \
-lvtkFiltersStatistics-9.0 \
-lvtkFiltersTexture-9.0 \
-lvtkFiltersTopology-9.0 \
-lvtkFiltersVerdict-9.0 \
-lvtkfreetype-9.0 \
-lvtkGeovisCore-9.0 \
-lvtkgl2ps-9.0 \
-lvtkglew-9.0 \
-lvtkGUISupportQt-9.0 \
-lvtkGUISupportQtSQL-9.0 \
-lvtkhdf5-9.0 \
-lvtkhdf5_hl-9.0 \
-lvtkImagingColor-9.0 \
-lvtkImagingCore-9.0 \
-lvtkImagingFourier-9.0 \
-lvtkImagingGeneral-9.0 \
-lvtkImagingHybrid-9.0 \
-lvtkImagingMath-9.0 \
-lvtkImagingMorphological-9.0 \
-lvtkImagingSources-9.0 \
-lvtkImagingStatistics-9.0 \
-lvtkImagingStencil-9.0 \
-lvtkInfovisCore-9.0 \
-lvtkInfovisLayout-9.0 \
-lvtkInteractionImage-9.0 \
-lvtkInteractionStyle-9.0 \
-lvtkInteractionWidgets-9.0 \
-lvtkIOAMR-9.0 \
-lvtkIOAsynchronous-9.0 \
-lvtkIOCityGML-9.0 \
-lvtkIOCore-9.0 \
-lvtkIOEnSight-9.0 \
-lvtkIOExodus-9.0 \
-lvtkIOExport-9.0 \
-lvtkIOExportGL2PS-9.0 \
-lvtkIOExportPDF-9.0 \
-lvtkIOGeometry-9.0 \
-lvtkIOImage-9.0 \
-lvtkIOImport-9.0 \
-lvtkIOInfovis-9.0 \
-lvtkIOLegacy-9.0 \
-lvtkIOLSDyna-9.0 \
-lvtkIOMINC-9.0 \
-lvtkIOMotionFX-9.0 \
-lvtkIOMovie-9.0 \
-lvtkIONetCDF-9.0 \
-lvtkIOOggTheora-9.0 \
-lvtkIOParallel-9.0 \
-lvtkIOParallelXML-9.0 \
-lvtkIOPLY-9.0 \
-lvtkIOSegY-9.0 \
-lvtkIOSQL-9.0 \
-lvtkIOTecplotTable-9.0 \
-lvtkIOVeraOut-9.0 \
-lvtkIOVideo-9.0 \
-lvtkIOXML-9.0 \
-lvtkIOXMLParser-9.0 \
-lvtkjpeg-9.0 \
-lvtkjsoncpp-9.0 \
-lvtklibharu-9.0 \
-lvtklibproj-9.0 \
-lvtklibxml2-9.0 \
-lvtkloguru-9.0 \
-lvtklz4-9.0 \
-lvtklzma-9.0 \
-lvtkmetaio-9.0 \
-lvtknetcdf-9.0 \
-lvtkogg-9.0 \
-lvtkParallelCore-9.0 \
-lvtkParallelDIY-9.0 \
-lvtkpng-9.0 \
-lvtkpugixml-9.0 \
-lvtkRenderingAnnotation-9.0 \
-lvtkRenderingContext2D-9.0 \
-lvtkRenderingCore-9.0 \
-lvtkRenderingFreeType-9.0 \
-lvtkRenderingGL2PSOpenGL2-9.0 \
-lvtkRenderingImage-9.0 \
-lvtkRenderingLabel-9.0 \
-lvtkRenderingLOD-9.0 \
-lvtkRenderingOpenGL2-9.0 \
-lvtkRenderingQt-9.0 \
-lvtkRenderingSceneGraph-9.0 \
-lvtkRenderingUI-9.0 \
-lvtkRenderingVolume-9.0 \
-lvtkRenderingVolumeOpenGL2-9.0 \
-lvtkRenderingVtkJS-9.0 \
-lvtksqlite-9.0 \
-lvtksys-9.0 \
-lvtkTestingRendering-9.0 \
-lvtktheora-9.0 \
-lvtktiff-9.0 \
-lvtkverdict-9.0 \
-lvtkViewsContext2D-9.0 \
-lvtkViewsCore-9.0 \
-lvtkViewsInfovis-9.0 \
-lvtkViewsQt-9.0 \
-lvtkWrappingTools-9.0 \
-lvtkzlib-9.0 \

其中:

INCLUDEPATH += $$PWD/../../../../../usr/local/include/vtk-9.0
DEPENDPATH += $$PWD/../../../../../usr/local/include/vtk-9.0

1.DEPENDPATH

我们知道pro文件是Qt专有的项目配置文件,他的使用方式为,编译时先用qmake根据pro文件生成Makefile文件,再用make执行Makefile完成编译,那我们就看一下Makefile文件有啥区别

假如设置我们只有一个文件main.cpp要编译,DEPENDPATH = xxxx,xxxx里有两个文件dep.h和dep.cpp,对比后发现,加不加DEPENDPATH设置的区别如下:

没有DEPENDPATH设置
debug/main.o: ../../TestBoost/main.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\main.o ..\..\TestBoost\main.cpp
 
增加DEPENDPATH设置
debug/main.o: ../../TestBoost/main.cpp def.h
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug\main.o ..\..\TestBoost\main.cpp

根据makefile规则,紧跟在main.o: 后面的文件是编译生成main.o文件时依赖的文件,这个依赖的意思是,如果依赖的文件在main.o文件发生过更改,那么下次编译时main.o需要重新生成,否则无需重新生成

增加DEPENDPTH后,Qt会将该目录下所有的头文件加入到每个cpp文件对应的.o文件的依赖文件里,这样如果DEPENDPATH目录里的头文件发生了变化,所有的cpp都会重新编译
2.INCLUDEPATH

根据上述方式测试INCLUDEPATH,INCLUDEPATH 同样会被添加到编译.o文件的依赖文件中,不过INCLUDEPATH还有另一个作用就是,在代码里写#include时可以找到相应的文件,否则编译时会报找不到文件的错误。
————————————————
参考原文链接:https://blog.csdn.net/My__God/article/details/111517166

至于安装VTK生成的头文件目录,如果用的是默认的路径的话CMAKE_INSTALL_PREFIX = /usr/local,头文件就在/usr/local/include/vtk-9.0。不确定自己这里有没有可以进到这个目录下看一看。
安装VTK时BUILD_SHARED_LIBS = ON 编译生成的是动态链接库,位于/usr/local/lib
在这里插入图片描述

后面的一长串,是程序运行需要的链接的动态库。去掉对应库文件的.so后缀和前缀lib剩下的就是库名,然后在库名前加上-l(小写的L), -L后面跟的是链接库的路径,-l后面跟的是在程序中具体用到的库。这里是我为了一劳永逸,直接把该目录下所有的VTK链接库全带上了。

LIBS += -L$$PWD/../../../../../usr/local/lib/ \
-lvtkChartsCore-9.0 \
-lvtkCommonColor-9.0 \
...

到这里.pro文件就配置好了。

2.2 添加一个简单的VTK窗口显示案例程序

修改main.cpp:

#include "mainwindow.h"

#include <QApplication>

//本程序中使用到的VTK头文件
#include "vtkRenderWindow.h"
#include "vtkSmartPointer.h"

//VTK程序需要使用下面这两行代码来初始化,不然的话,运行程序啥都没有
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);//这一行当前程序用不到,不起作用


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    //直接在Qt自动生成的代码后添加VTK程序
    vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();//使用智能指针定义了一个类型为vtkRenderWindow的对象,这是VTK的类实例话对象的基本用法
    renWin->Render();//调用vtkRenderWindow里的方法显示并渲染一个VTK窗口
    std::cout<<"Hello World"<<std::endl;//只是测试
    std::cin.get();//没其他意义,只不过让程序暂停下来,等待接受用户的输入,目的是显示VTK窗口,防止VTK窗口一闪而过
    //return a.exec();
    return 0;
}

为了方便输入输出,在Qt左侧项目 ,点击run,在右侧的运行中选中 Run in Terminal.
在这里插入图片描述

2.3 构建、运行

输出结果,现在有三个窗口,一个Qt的,一个VTK的,一个终端用于输入输出。其实把Qt的窗口代码注释掉,不用显示Qt的窗口。
在这里插入图片描述如果到这一步都没啥问题,那就可以继续更加深入地使用VTK了。

三、使用CMAKE来编译VTK程序

3.1 新建一个测试文件夹,在这个文件夹中创建两个文件,newone.cpp 和 CMakeLists.txt.

newone.cpp

#include "vtkRenderWindow.h"
#include "vtkSmartPointer.h"
#include "vtkAutoInit.h"


VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
int main()
{

    vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
    //vtkRenderWindow* renWin = vtkRenderWindow::New();
    renWin->Render();
    std::cout<<"Hello World"<<std::endl;


    std::cin.get();

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

PROJECT(newone)

find_package(VTK REQUIRED)

add_executable(newone MACOSX_BUNDLE newone.cpp)
INCLUDE_DIRECTORIES(/usr/local/include/vtk-9.0)

if(VTK_LIBRARIES)
  target_link_libraries(newone ${VTK_LIBRARIES})
else()
  target_link_libraries(newone 
vtkChartsCore-9.0
vtkCommonColor-9.0
vtkCommonComputationalGeometry-9.0
vtkCommonCore-9.0
vtkCommonDataModel-9.0
vtkCommonExecutionModel-9.0
vtkCommonMath-9.0
vtkCommonMisc-9.0
vtkCommonSystem-9.0
vtkCommonTransforms-9.0
vtkDICOM-9.0
vtkDICOMParser-9.0
vtkDomainsChemistry-9.0
vtkdoubleconversion-9.0
vtkexodusII-9.0
vtkexpat-9.0
vtkFiltersAMR-9.0
vtkFiltersCore-9.0
vtkFiltersExtraction-9.0
vtkFiltersFlowPaths-9.0
vtkFiltersGeneral-9.0
vtkFiltersGeneric-9.0
vtkFiltersGeometry-9.0
vtkFiltersHybrid-9.0
vtkFiltersHyperTree-9.0
vtkFiltersImaging-9.0
vtkFiltersModeling-9.0
vtkFiltersParallel-9.0
vtkFiltersParallelImaging-9.0
vtkFiltersPoints-9.0
vtkFiltersProgrammable-9.0
vtkFiltersSelection-9.0
vtkFiltersSMP-9.0
vtkFiltersSources-9.0
vtkFiltersStatistics-9.0
vtkFiltersTexture-9.0
vtkFiltersTopology-9.0
vtkFiltersVerdict-9.0
vtkfreetype-9.0
vtkGeovisCore-9.0
vtkgl2ps-9.0
vtkglew-9.0
vtkGUISupportQt-9.0
vtkGUISupportQtSQL-9.0
vtkhdf5-9.0
vtkhdf5_hl-9.0
vtkImagingColor-9.0
vtkImagingCore-9.0
vtkImagingFourier-9.0
vtkImagingGeneral-9.0
vtkImagingHybrid-9.0
vtkImagingMath-9.0
vtkImagingMorphological-9.0
vtkImagingSources-9.0
vtkImagingStatistics-9.0
vtkImagingStencil-9.0
vtkInfovisCore-9.0
vtkInfovisLayout-9.0
vtkInteractionImage-9.0
vtkInteractionStyle-9.0
vtkInteractionWidgets-9.0
vtkIOAMR-9.0
vtkIOAsynchronous-9.0
vtkIOCityGML-9.0
vtkIOCore-9.0
vtkIOEnSight-9.0
vtkIOExodus-9.0
vtkIOExport-9.0
vtkIOExportGL2PS-9.0
vtkIOExportPDF-9.0
vtkIOGeometry-9.0
vtkIOImage-9.0
vtkIOImport-9.0
vtkIOInfovis-9.0
vtkIOLegacy-9.0
vtkIOLSDyna-9.0
vtkIOMINC-9.0
vtkIOMotionFX-9.0
vtkIOMovie-9.0
vtkIONetCDF-9.0
vtkIOOggTheora-9.0
vtkIOParallel-9.0
vtkIOParallelXML-9.0
vtkIOPLY-9.0
vtkIOSegY-9.0
vtkIOSQL-9.0
vtkIOTecplotTable-9.0
vtkIOVeraOut-9.0
vtkIOVideo-9.0
vtkIOXML-9.0
vtkIOXMLParser-9.0
vtkjpeg-9.0
vtkjsoncpp-9.0
vtklibharu-9.0
vtklibproj-9.0
vtklibxml2-9.0
vtkloguru-9.0
vtklz4-9.0
vtklzma-9.0
vtkmetaio-9.0
vtknetcdf-9.0
vtkogg-9.0
vtkParallelCore-9.0
vtkParallelDIY-9.0
vtkpng-9.0
vtkpugixml-9.0
vtkRenderingAnnotation-9.0
vtkRenderingContext2D-9.0
vtkRenderingCore-9.0
vtkRenderingFreeType-9.0
vtkRenderingGL2PSOpenGL2-9.0
vtkRenderingImage-9.0
vtkRenderingLabel-9.0
vtkRenderingLOD-9.0
vtkRenderingOpenGL2-9.0
vtkRenderingQt-9.0
vtkRenderingSceneGraph-9.0
vtkRenderingUI-9.0
vtkRenderingVolume-9.0
vtkRenderingVolumeOpenGL2-9.0
vtkRenderingVtkJS-9.0
vtksqlite-9.0
vtksys-9.0
vtkTestingRendering-9.0
vtktheora-9.0
vtktiff-9.0
vtkverdict-9.0
vtkViewsContext2D-9.0
vtkViewsCore-9.0
vtkViewsInfovis-9.0
vtkViewsQt-9.0
vtkWrappingTools-9.0
vtkzlib-9.0
)
endif()

其中cmake_minimum_required 指定构建工程时所需的CMake版本需求;
PROJECT该命令指定工程名称;
find_package用于搜索并加载外部工程;
INCLUDE_DIRECTORIES用于确定头文件路径;
target_link_libraries用于指定生成可执行文件时需要链接哪些文件。

3.2 使用cmake编译

CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:

  1. cmake
  2. make

cmake 指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译。在当前的源代码文件夹内,打开终端执行下面几行命令,编译生成可执行文件:

mkdir build
cd build
cmake ..
make

最后使用./newone执行可执行文件。出现下面的VTK窗口就算成功了,后面就可以自由发挥了。

/NewOne/build$ ./newone

在这里插入图片描述

四、遇到的问题(犯的错)

回忆从安装VTK开始,到第一个案例真的跑起来,我真的是遇到了很多的问题,差不多都快放弃了(其实我太垃圾了)。当时就想实在不行,还是换回OSG吧,至少OSG成功跑起来了。不过终于在今天凌晨一点把VTK成功弄好了,现在把这个过程中遇到的问题赶紧记录一下,不然以后又忘了。案例程序的配置过程我是依照《VTK图形图像开发进阶》这本书来的,但是它使用的版本太老,又都是在windows环境下,所以不能完全依照他的写法,但是程序部分还是可以参考的。

4.1 Qt中报错找不到头文件

error: vtkRenderWindow.h: No such file or directory
../CSDN_Case/main.cpp:4:10: fatal error: vtkRenderWindow.h: No such file or directory
    4 | #include "vtkRenderWindow.h"
      |          ^~~~~~~~~~~~~~~~~~~

在这里插入图片描述刚开始的时候不知道这两个头文件在哪,使用文件搜索功能,发现vtkRenderWindow.h在VTK的源代码目录下有,而且还有对应的定义cxx文件,在/usr/local/include/vtk-9.0这个目录下也有头文件。
在这里插入图片描述然后把INCLUDEPATH += $$PWD/../../../../../home/liukai/Reply/VTK/VTK-9.0.1/Rendering/Core/当成了头文件目录,仿造OSG的配置方法,把链接库配置如下,因为本案例程序从头文件名来看只用到了vtkRenderingCore-9.0 vtkCommonCore-9.0这两个库,所以就先这样配置了。

 LIBS += -L$$PWD/../../../../../usr/local/lib/ -lvtkRenderingQt-9.0 -lvtkRenderingCore-9.0 -lvtkCommonCore-9.0 -lpthread

INCLUDEPATH += $$PWD/../../../../../home/liukai/Reply/VTK/VTK-9.0.1/Rendering/Core/
DEPENDPATH += $$PWD/../../../../../home/liukai/Reply/VTK/VTK-9.0.1/Rendering/Core/
INCLUDEPATH += $$PWD/../../../../../home/liukai/Reply/VTK/VTK-9.0.1/Common/Core/
DEPENDPATH += $$PWD/../../../../../home/liukai/Reply/VTK/VTK-9.0.1/Common/Core/

然后在Qt中构建项目,结果:

../Reply/VTK/VTK-9.0.1/Common/Core/vtkIOStream.h:25: error: vtkConfigure.h: No such file or directory
In file included from ../../../Reply/VTK/VTK-9.0.1/Common/Core/vtkNew.h:47,
                 from ../../../Reply/VTK/VTK-9.0.1/Rendering/Core/vtkRenderWindow.h:44,
                 from ../CSDN_Case/main.cpp:4:
../../../Reply/VTK/VTK-9.0.1/Common/Core/vtkIOStream.h:25:10: fatal error: vtkConfigure.h: No such file or directory
   25 | #include "vtkConfigure.h"
      |          ^~~~~~~~~~~~~~~~

就会出现各种因为头文件中使用到的其他头文件未被包含,而找不到的错误。找到了这个文件,包含进来,下次又是其他的文件找不到,那要是把所有的问题解决我得包含多少路径,于是我开始意识到这种方法可能一开始就不对。于是把头文件的包含路径换回了/usr/local/include/vtk-9.0 ,把.pro文件修改成了下面这样:

INCLUDEPATH += $$PWD/../../../../../usr/local/include/vtk-9.0
DEPENDPATH += $$PWD/../../../../../usr/local/include/vtk-9.0

LIBS += -L$$PWD/../../../../../usr/local/lib/ -lvtkRenderingQt-9.0 -lvtkRenderingCore-9.0 -lvtkCommonCore-9.0 -lpthread

现在终于构建不报错了,但是运行VTK程序就是死活啥反应都没有其实这里是最接近成功的一次
百度VTK运行后没反应,就没找到相关的回答。然后想到了用调试来看看,到底有没有真正的执行VTK源码。但是调试F11到达VTK函数Render()和New()时,就只在头文件里打转,进不了具体的函数定义文件。(后来才发现貌似就算程序配置得没问题,也不会直接跳到cxx定义文件中,这里我猜测是使用链接动态库之后,具体的定义已经被写入了动态库当中,所以是不会直接进入定义的cxx文件中的,不知道这样理解对不对?有大佬知道的话可以评论区说一下)

当时还以为就是因为进不去定义的文件才导致啥也不显示出来,然后又把包含的头文件路径改成了包含头文件又包含定义的cxx文件路径,但还是不行,而且有错;结果绕来绕去把心态弄炸了。昨天终于狠下心花了点钱看了这篇VIP文章https://blog.csdn.net/dongdong_csdn/article/details/80877121,才幡然醒悟。

其实.pro文件就按之前的这个,但是还差一点,

INCLUDEPATH += $$PWD/../../../../../usr/local/include/vtk-9.0
DEPENDPATH += $$PWD/../../../../../usr/local/include/vtk-9.0

LIBS += -L$$PWD/../../../../../usr/local/lib/ -lvtkRenderingQt-9.0 -lvtkRenderingCore-9.0 -lvtkCommonCore-9.0 -lpthread

但是一定要在main.cpp中加上下面的代码,这两句是VTK初始化必须的初始化代码,不然什么都显示不出来,没反应。

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);//VTK was built with vtkRenderingOpenGL2

本来以为加上就可以了,结果:

:-1: error: main.o: in function `(anonymous namespace)::vtkRenderingOpenGL2_ModuleInit::vtkRenderingOpenGL2_ModuleInit()':
/Documents/Qt_WorkSpace/build-CSDN_Case-Desktop_Qt_5_15_2_GCC_64bit-Debug/../CSDN_Case/main.cpp:9: error: undefined reference to `vtkRenderingOpenGL2_AutoInit_Construct()'

在这里插入图片描述
心态再次炸裂。冷静下来之后,仔细想想,调用这种三方库,出现error: undefined reference to 多半都是由于没有包含对应的动态链接库,然后就老老实实的按那篇VIP文章中的一劳永逸,把所有的链接库都写进去,就可以了。
花了我两天两夜结果终于成功了。

4.2 CMake中遇到的问题,犯错

多数问题,在QT中解决之后,基本都明了了。关于CMake的使用,我主要参考的是这篇博客https://blog.csdn.net/baidu_38172402/article/details/80751312

五、总结

首先,自己菜,啥都不懂,对QT,CMAKE都不熟。
找到一份正确的参考资料很重要。
遇到问题一定要冷静,最好去问问大佬。

最后,如果文章中有什么问题的话,欢迎各位大佬在评论区指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值