Ky artikull përshkruan procesin e plotë të konfigurimit, ndërtimit, instalimit dhe çinstalimit të VTK-9.1 në Ubuntu 18.04.

1. Parakushtet

Sigurohuni që ne kemi mjetet e nevojshme për të ndërtuar VTK. Vraponi

$ sudo apt install build-essential cmake mesa-common-dev mesa-utils freeglut3-dev python3-dev python3-venv git-core ninja-build

Komanda e mësipërme i referohet dokumentacionit të shkurtër të instalimit të VTK, i cili është gjithëpërfshirës, ​​por jo specifik. Për mua, meqenëse kam instaluar disa paketa paraprakisht, kam instaluar vetëm ninja-build, mesa-utils, doxygen, graphviz* dhe Qt5 shtesë. Përdorni apt policy <packageName> për të kontrolluar instalimin.

Për përditësimin ose instalimin e cmake, ccmake dhe Qt5, referojuni artikujve më poshtë.







2. Konfiguro VTK me CMake

Këtu krijojmë strukturën e dosjes, marrim burimin VTK dhe e ndërtojmë atë.

Shkoni në "faqen zyrtare të VTK" dhe shkarkoni versionin më të fundit (9.1.0 për këtë kohë). Këtu mund të shihni listën e mëposhtme:

Zgjidhni të parën (VTK-9.1.0.tar.gz), vendoseni në drejtorinë tuaj të dëshiruar, si p.sh. /opt/, dhe ekzekutoni

$ sudo tar -zxvf VTK-9.1.0.tar.gz -C /opt
$ cd /opt/VTK-9.1.0
$ sudo mkdir VTK-build
$ cd VTK-build
$ ccmake ..

Dhe tani, do të shfaqen disa hyrje. Shkruani c për të konfiguruar, dhe CMake më pas do të përpunojë skedarët e konfigurimit dhe nëse është e nevojshme do të shfaqë opsione të reja në krye (për shembull, nëse aktivizoni VTK_WRAP_PYTHON, do t'ju paraqiten opsionet për vendndodhjen e ekzekutuesit të Python, bibliotekat dhe shtigjet e përfshira). Pas rikonfigurimit, shkruani sërish c dhe vazhdoni këtë proces derisa të mos ketë opsione të reja. Më pas, mund të shtypni g që CMake të gjenerojë skedarë të rinj dhe të dalë.

Nëse keni nevojë të ndryshoni opsionet e ndërtimit në të ardhmen, thjesht ridrejtoni ccmake dhe ndiqni udhëzimet e mësipërme.

Këtu janë opsionet e mia, vetëm për referencë:

Për variablat që përdorin cilësimet e ndërtimit të sistemit të modulit, vlerat e vlefshme janë si më poshtë:

  • YES: Kërkoni që moduli të ndërtohet.
  • WANT: Ndërtoni modulin nëse është e mundur.
  • DEFAULT: Përdorni cilësimet sipas grupeve të modulit dhe VTK_BUILD_ALL_MODULES.
  • DONT_WANT: Mos e ndërtoni modulin nëse nuk kërkohet si varësi.
  • NO: Mos e ndërto modulin.

Nëse merrni disa gabime si:

(1) Asnjë CMAKE_CUDA_COMPILER nuk mund të gjendej:

CMake Error at CMakeLists.txt:7 (project):
No CMAKE_CUDA_COMPILER could be found.
Tell CMake where to find the compiler by setting either the environment
variable "CUDACXX" or the CMake cache entry CMAKE_CUDA_COMPILER to the full
path to the compiler, or to the compiler name if it is in the PATH.

Vendosni CUDACXX=/usr/local/cuda/bin/nvcc/etc/environment në mënyrë që të zbatohet kur përdorni sudo. Vini re se kjo variabël nuk mund të futet në ~/.bashrc dhe arsyeja mund të shihet në pjesën suplementet të këtij artikulli.

(2) Nuk mund të gjesh OPENGL_GLES2_INCLUDE_DIR dhe OPENGL_GLES3_INCLUDE_DIR:

Thjesht vrapo

$ sudo apt policy libgles2-mesa-dev

Dhe më pas, do të gjeni drejtoritë GLES2 dhe GLES3/usr/include.

Vini re, megjithëse paketa përmban vetëm emrin e gles2, por gjithashtu përmban përmbajtjen e gles3 në fakt.

(3) Nuk mund të gjejë skedarët Doxygen (Ky problem në fakt ndodh gjatë instalimit)

Ky problem shfaqet vetëm kur vendosni BUILD_DOCUMENTATION=ON në konfigurimin CMake.

Së pari, instaloni graphviz

sudo apt install graphviz*

Pastaj, meqenëse tashmë kemi ekzekutuar një komandë si make -j$(nproc), tani na duhet vetëm të ndërtojmë Doxygen veçmas.

Ndryshoni drejtorinë tuaj në /opt/VTK-9.1.0/VTK-build dhe ekzekutoni

make DoxygenDoc

Dokumentacioni që rezulton do të jetë në

/opt/VTK-9.1.0/VTK-build/Utilities/Doxygen/doc/html

Ose nëse doni të ndërtoni nga e para, thjesht vraponi

$ sudo make uninstall
$ sudo make clean

Lloji make clean në vijën e komandës mund t'ju lejojë të hiqni qafe objektin tuaj dhe skedarët e ekzekutueshëm. Ndonjëherë përpiluesi lidh ose përpilon skedarët gabimisht dhe e vetmja mënyrë për të filluar një fillim të ri ështëheqja e të gjithë objektit dhe skedarëve të ekzekutueshëm.

Pastaj vraponi si më parë

$ sudo make -j$(nproc)
$ sudo make install

3. Ndërtoni VTK

Vraponi

$ cd /opt/VTK-9.1.0/VTK-build
$ make -j$(nproc)

4. Instaloni VTK

Vraponi

$ cd /opt/VTK-9.1.0/VTK-build
$ sudo make install

Përmblidhni në mënyrë gjithëpërfshirëse dy hapat e mësipërm. Kur bëni diçka si “make all”, programi make ekzekuton një rregull të quajtur “all” nga një skedar në drejtorinë aktuale të quajtur “Makefile”. Ky rregull zakonisht thërret përpiluesin të përpilojë disa kode burimore në binare.

Kur bëni "make install", programi make merr binarët nga hapi i mëparshëm dhe i kopjon ato në disa vende të përshtatshme në mënyrë që të mund të aksesohen. Me pak fjalë, "make install" thjesht kopjon skedarët e përpiluar në vendndodhje të përshtatshme, që është /usr/local/ si parazgjedhje.

Është shumë më e lehtë që softueri i ndërtuar në vend të jetojë në një vend dhe softueri i ofruar nga distribucioni të jetojë në "drejtoritë kryesore": /usr/bin/, e kështu me radhë. (Paketuesit janë shumë të kujdesshëm që kurrë të mos prekin skedarët në /usr/local/ -- ata e dinë se është ekskluzivisht për administratorët e sistemit.)

Për të testuar instalimin, ekzekutoni CylinderExample.py në vijim:

#!/usr/bin/env python3
# This simple example shows how to do basic rendering and pipeline
# creation.
# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkCylinderSource
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)
def main():
    colors = vtkNamedColors()
    # Set the background color.
    bkg = map(lambda x: x / 255.0, [26, 51, 102, 255])
    colors.SetColor("BkgColor", *bkg)
# This creates a polygonal cylinder model with eight circumferential
    # facets.
    cylinder = vtkCylinderSource()
    cylinder.SetResolution(8)
# The mapper is responsible for pushing the geometry into the graphics
    # library. It may also do color mapping, if scalars or other
    # attributes are defined.
    cylinderMapper = vtkPolyDataMapper()
    cylinderMapper.SetInputConnection(cylinder.GetOutputPort())
# The actor is a grouping mechanism: besides the geometry (mapper), it
    # also has a property, transformation matrix, and/or texture map.
    # Here we set its color and rotate it -22.5 degrees.
    cylinderActor = vtkActor()
    cylinderActor.SetMapper(cylinderMapper)
    cylinderActor.GetProperty().SetColor(colors.GetColor3d("Tomato"))
    cylinderActor.RotateX(30.0)
    cylinderActor.RotateY(-45.0)
# Create the graphics structure. The renderer renders into the render
    # window. The render window interactor captures mouse events and will
    # perform appropriate camera or actor manipulation depending on the
    # nature of the events.
    ren = vtkRenderer()
    renWin = vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)
# Add the actors to the renderer, set the background and size
    ren.AddActor(cylinderActor)
    ren.SetBackground(colors.GetColor3d("BkgColor"))
    renWin.SetSize(300, 300)
    renWin.SetWindowName('CylinderExample')
# This allows the interactor to initalize itself. It has to be
    # called before an event loop.
    iren.Initialize()
# We'll zoom in a little by accessing the camera and invoking a "Zoom"
    # method on it.
    ren.ResetCamera()
    ren.GetActiveCamera().Zoom(1.5)
    renWin.Render()
# Start the event loop.
    iren.Start()
if __name__ == '__main__':
    main()

Futni këto në vijën tuaj të komandës:

$ python3 CylinderExample.py

or

$ vtkpython CylinderExample.py

Në rrethana normale, të dyja këto do të marrin një cilindër si:

Njoftim. Nëse vetëm vtkpython mund ta ekzekutojë saktë këtë skedar .py dhe merr një gabim ModuleNotFoundError: No module named ‘vtkmodules’ kur përdor python3, problemi mund të jetë se vendndodhja e bibliotekave të përbashkëta nuk është konfiguruar saktë.

Sistemi gjithmonë harton një emër të përbashkët të bibliotekës në vendndodhjen e skedarit përkatës të bibliotekës së përbashkët të përcaktuar në /etc/ld.so.conf.d/*.conf.

Prodhimi i cat /etc/ld.so.conf.d/* do t'ju tregojë të gjitha vendndodhjet e përcaktuara atje. Për mua, është si:

/usr/local/cuda-11.3/targets/x86_64-linux/lib
/usr/lib/x86_64-linux-gnu/libfakeroot
# Multiarch support
/usr/local/lib/i386-linux-gnu
/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu
/usr/local/lib/i686-linux-gnu
/lib/i686-linux-gnu
/usr/lib/i686-linux-gnu
# libc default configuration
/usr/local/lib
/usr/local/opencv4/lib
# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

Më konkretisht, drejtoritë e bibliotekave të përbashkëta që do të kërkojë python përcaktohen në sys.path. Për t'i kontrolluar ose manipuluar ato, thjesht ekzekutoni:

import sys
print ('\n'.join(sys.path))

Në këtë rast, prodhimi i python3 dhe vtkpython tregon se humbja e vtkmodules është shkaktuar nga mungesa e /usr/local/lib/python3.6/site-packages sys.path e python3.

Kështu, për të siguruar funksionimin e saktë të kodeve, mos harroni të specifikoni interpretuesin python si vtkpython, ose thjesht shtoni /usr/local/lib/python3.6/site-packagessys.pathpython3, si p.sh.

import sys
sys.path.append ("/usr/local/lib/python3.6/site-packages")

Dhe përdorni komandën e mëposhtme për ta hequr atë:

import sys
sys.path.remove('/usr/local/lib/python3.6/site-packages')

Ose gjithashtu mund të vendosni cilësimet PYTHONPATY që të përfshijnë /usr/local/lib/python3.6/site-packages.

Për më shumë detaje, referojuni këtij artikulli:



5. Çinstaloni VTK

Kur dëshironi të çinstaloni VTK-në, gjithçka që duhet të bëni është të ktheheni këtu dhe të vraponi

$ sudo make uninstall

Kjo komandë do të heqë automatikisht të gjithë skedarët që keni kopjuar në /usr/local/ si parazgjedhje. Por kjo do të funksionojë vetëm nëse zhvilluesi i paketës është kujdesur të bëjë një rregull të mirë të çinstalimit.

Nëse nuk e kanë bërë, ka edhe mënyra të tjera për të çinstaluar paketat e ndërtuara nga skedarët burim me dorë.

E para është checkinstall.

checkinstall është një program që monitoron një procedurë instalimi (siç është make install, install.sh) dhe krijon një paketë standarde për shpërndarjen tuaj (aktualisht mbështeten paketat deb, rpm dhe tgz) që mund ta instaloni përmes sistemit të menaxhimit të paketave të shpërndarjes ( dpkg, rpm ose installpkg).

Nëse e keni ekzekutuar tashmë make install, mund të përdorni ende checkinstall. Normalisht checkinstall do të mbishkruajë gjithçka që krijoi make install. Pas kësaj, thjesht përdorni dpkg -r <package.deb>, dhe gjithçka duhet të hiqet.

Thjesht vrapo

$ sudo checkinstall

Një paketë *.deb do të krijohet në drejtori, dhe gjithashtu do të instalohet në /usr/local/bin/, përveç nëse përdorni --install=no e cila do të krijojë vetëm një paketë deb pa instalim.

Si parazgjedhje, apt ruan skedarët .deb në /var/cacke/apt/archive/. Nëse nuk mund të gjeni disa paketa atje, mund të keni ekzekutuar një komandë pastrimi si sudo apt clean për të pastruar skedarët .deb.

Për të kërkuar të gjithë skedarët .deb në sistemin tuaj duke bërë sa më poshtë:

$ sudo updatedb

Kjo do të përditësojë bazën e të dhënave të lacate për të kërkuar skedarë të krijuar/hequr rishtazi.

$ locate *.deb

i cili do të kërkojë në folderin tuaj_68 në mënyrë rekursive për të gjithë skedarët që mbarojnë me .deb.

Për më shumë detaje të përdorimit të instalimit të kontrollit, shkoni te "Wiki i Ndihmës së Komunitetit".

5. Disa suplemente:

(1) Diskriminimi i Mesa dhe OpenGL

OPENGL_GLES2_INCLUDE_DIR / OPENGL_GLES3_INCLUDE_DIR: Këto dy hyrje u referohen versioneve të ndryshme të bibliotekave OPENGL ES.

OpenGL (Biblioteka e Grafikës së Hapur) është një ndërfaqe programimi aplikacioni ndër-platformë (API) ndër-gjuhëshe për paraqitjen e grafikave vektoriale 2D dhe 3D. API zakonisht përdoret për të ndërvepruar me një njësi përpunimi grafik (GPU), për të arritur renderim të përshpejtuar nga hardueri.

OpenGL për sistemet e integruara (OpenGL ES ose GLES) është një nëngrup i ndërfaqes së programimit të aplikacionit për paraqitjen e grafikëve kompjuterikë OpenGL (API) për paraqitjen 2D dhe Grafika kompjuterike 3D si ato të përdorura nga lojërat video, zakonisht të përshpejtuara nga hardueri duke përdorur një njësi përpunimi grafik (GPU). Është projektuar për sisteme të integruara si telefonat inteligjentë, kompjuterët tabletë, konzolat e lojërave video dhe PDA.

Dallimi midis Mesa dhe OpenGL është se Mesa ofron ndërfaqen OpenGL në anën e klientit për drejtuesit GPU me burim të hapur bazuar në arkitekturën DRI2/DRM. Ose me fjalë të tjera: është gjithashtu një pjesë e një shoferi.

Nëse keni të instaluar drejtuesit e pronarit nga NVidia ose AMD, nuk keni nevojë për Mesa. Nëse dëshironi të përdorni drejtuesit me burim të hapur (nouveau, radeon, radeonhd, intel) ju duhet Mesa.

Mesa, i quajtur gjithashtu Mesa3D dhe Biblioteka grafike Mesa 3D, është një zbatim softuerësh me burim të hapur të OpenGL, Vulkan dhe API-të e tjera grafike specifikimet. Mesa i përkthen këto specifikime në drejtuesit e harduerit grafikë specifikë të shitësve.

Përdoruesit e tij më të rëndësishëm janë dy drejtues grafikë të zhvilluar dhe financuar kryesisht nga intel dhe AMD për harduerin e tyre përkatës (AMD promovon drejtuesit e tyre Mesa Radeon dhe RadeonSI mbi AMD Catalyst të vjetëruar dhe Intel ka mbështetur vetëm drejtuesin Mesa). Drejtuesit grafikë të pronarit (p.sh., drejtuesi i Nvidia GeForce dhe Catalyst) zëvendësojnë të gjithë Mesa-n, duke siguruar zbatimin e tyre të një API grafike. Një përpjekje me burim të hapur për të shkruar një drejtues Mesa Nvidia të quajtur Nouveau është zhvilluar kryesisht nga komuniteti.

Forumi LinuxQuestions.org dha gjithashtu një shpjegim të mirë për ndryshimin midis Mesa dhe OpenGL:

OpenGL dhe Mesa nuk janë me të vërtetë dy zgjedhje të ndara, por Mesa është një lloj specifik i OpenGL.

OpenGL është thjesht një ndërfaqe që përcakton një grup standard funksionesh të nevojshme për vizatimin e grafikave 3D. Ai nuk përfshin kodin aktual që i bën këto funksione të ndodhin, ai vetëm specifikon se si quhen funksionet dhe çfarë duhet të bëjnë.

Një zbatim openGL siguron kodin aktual që ekzekuton metodat e specifikuara nga standardi OpenGL. Pa instaluar një implementim, nuk mund të ekzekutoni asnjë program opengl.

Mesa është vetëm një nga shumë implementimet e OpenGL, dhe është më standardi i përfshirë në shpërndarjet linux. Ai e bën të gjithë punën në softuer, prandaj është i ngadalshëm.

Kur instaloni drejtuesit Nvidia ose ATI për një kartë grafike të bukur, këta drejtues ofrojnë një zbatim të ri OpenGL që funksionon në kartën grafike. Ky implementim do të zinte vendin e zbatimit të Mesa, por është ende një zbatim openGL. Kjo do të thotë, të gjithë drejtuesit e Mesa/ATI/NVidia zbatojnë të njëjtin grup funksionesh, ata thjesht e bëjnë atë në mënyra të ndryshme dhe të gjithë janë openGL.

(2) Roli i NVCC

Nvidia CUDA Compiler(NVCC) është një përpilues i pronarit nga Nvidia i destinuar për përdorim me CUDA.

Kodi CUDA funksionon si në CPU ashtu edhe në GPU. NVCC i ndan këto dy pjesë dhe dërgon kodin pritës (pjesën e kodit që do të ekzekutohet në CPU) te një përpilues C si GCC ose Intel C++ Compiler (ICC) ose Microsoft Visual C++ Compiler, dhe dërgon kodi i pajisjes (pjesa që do të funksionojë në GPU) në GPU. Kodi i pajisjes përpilohet më tej nga NVCC.

Çdo skedar burimor që përmban shtesa të gjuhës CUDA (.cu) duhet të përpilohet me nvcc. NVCC është një drejtues përpiluesi i cili funksionon duke thirrur të gjitha mjetet dhe përpiluesit e nevojshëm si cudacc, g++, cl, etj.

Një ekzekutues me kod CUDA kërkon: bibliotekën thelbësore CUDA (cuda) dhe bibliotekën CUDA të kohës së funksionimit (cudart).

(3) Marrëdhënia ndërmjet .banshrc dhe sudo

.bashrc është një skedar konfigurimi i bash, vetëm kur ekzekutohet në mënyrë interaktive. Ai ngarkohet vetëm kur fillon bash, jo kur ekzekuton ndonjë program tjetër si sh ose ccmake (edhe nëse bash thirret nëpërmjet emrit sh). Dhe ngarkohet vetëm kur bash është ndërveprues, jo kur është duke ekzekutuar një skript ose një komandë me -c.

Me një fjalë, .bashrc do të vraponte vetëm nëse lëshonit një predhë fëmijësh. Normalisht, kur ekzekutoni një program me sudo, nuk ka nevojë të nisni një shell, dhe për këtë arsye .bashrc nuk lexohet/ekzekutohet.

6. Referenca