Can't build VTK sample project: Missing module

No I mean that your VTK is missing some required modules.

I installed vtk via vcpkg. How do you suggest I could acquire the missing modules? vcpkg says the vtk version is 9.0.3

I am not super familiar with how the VTK build process works

I do not know vcpkg, but VTK can be built easily from source:

That being said, this is strange that vcpkg do not have this VTK modules, so you may want to open an issue in vcpkf.

I just built vtk from source as the document describes, but it still doesn’t work. It’s weird. The cmake command works as it should:

ilmu011@ilmu011-VirtualBox:~/Desktop/CylinderExample$ cmake -S source -B build
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Skipping CylinderExample: 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ilmu011/Desktop/CylinderExample/build

However, when I run make, nothing happens. No text output, nothing and no executable is made.

I used the exact source file and cmake file, the only thing I changed in the CMakeLists.txt is add the line


in the 2nd line to provide the vtk directory in the cmake file so I don’t have to do it in the command.

What’s going on?

@limu011 Which version or VTK are you using? VTK 9.0 or VTK 9.1?

Please try removing vtkRenderingContextOpenGL2 and vtkRenderingGL2PSOpenGL2 from COMPONENTS, your project probably doesn’t need them:

find_package(VTK COMPONENTS 

@mwestfal This might be related to a bug in the VTK 9.0 configuration, where vtkRenderingContextOpenGL2 was accidentally left out of the default build. See !7646 for more information.

Also see related discussion here:

When I tried your suggestion of deleting the lines using the vcpkg installation (9.0.3), the previous error about not finding the package disappeared. However, trying to build the program with make generates this:

ilmu011@ilmu011-VirtualBox:~/Desktop/CylinderExample/build$ make
[ 50%] Building CXX object CMakeFiles/CylinderExample.dir/CylinderExample.cxx.o
[100%] Linking CXX executable CylinderExample
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(sfnt.c.o): in function `Load_SBit_Png':
sfnt.c:(.text+0x627c): undefined reference to `png_create_read_struct'
/usr/bin/ld: sfnt.c:(.text+0x6292): undefined reference to `png_create_info_struct'
/usr/bin/ld: sfnt.c:(.text+0x62b6): undefined reference to `png_set_longjmp_fn'
/usr/bin/ld: sfnt.c:(.text+0x62f7): undefined reference to `png_destroy_read_struct'
/usr/bin/ld: sfnt.c:(.text+0x634a): undefined reference to `png_set_read_fn'
/usr/bin/ld: sfnt.c:(.text+0x6359): undefined reference to `png_read_info'
/usr/bin/ld: sfnt.c:(.text+0x638a): undefined reference to `png_get_IHDR'
/usr/bin/ld: sfnt.c:(.text+0x63e0): undefined reference to `png_set_expand_gray_1_2_4_to_8'
/usr/bin/ld: sfnt.c:(.text+0x63f4): undefined reference to `png_get_valid'
/usr/bin/ld: sfnt.c:(.text+0x6432): undefined reference to `png_set_interlace_handling'
/usr/bin/ld: sfnt.c:(.text+0x6446): undefined reference to `png_set_filler'
/usr/bin/ld: sfnt.c:(.text+0x6455): undefined reference to `png_read_update_info'
/usr/bin/ld: sfnt.c:(.text+0x6486): undefined reference to `png_get_IHDR'
/usr/bin/ld: sfnt.c:(.text+0x64cc): undefined reference to `png_set_read_user_transform_fn'
/usr/bin/ld: sfnt.c:(.text+0x6597): undefined reference to `png_read_image'
/usr/bin/ld: sfnt.c:(.text+0x65a6): undefined reference to `png_read_end'
/usr/bin/ld: sfnt.c:(.text+0x6619): undefined reference to `png_set_gray_to_rgb'
/usr/bin/ld: sfnt.c:(.text+0x6631): undefined reference to `png_set_packing'
/usr/bin/ld: sfnt.c:(.text+0x6641): undefined reference to `png_set_tRNS_to_alpha'
/usr/bin/ld: sfnt.c:(.text+0x6650): undefined reference to `png_set_palette_to_rgb'
/usr/bin/ld: sfnt.c:(.text+0x6663): undefined reference to `png_set_strip_16'
/usr/bin/ld: sfnt.c:(.text+0x667d): undefined reference to `png_set_read_user_transform_fn'
/usr/bin/ld: sfnt.c:(.text+0x66b4): undefined reference to `png_destroy_read_struct'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(sfnt.c.o): in function `error_callback':
sfnt.c:(.text+0x6759): undefined reference to `png_get_error_ptr'
/usr/bin/ld: sfnt.c:(.text+0x6773): undefined reference to `png_set_longjmp_fn'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(sfnt.c.o): in function `read_data_from_FT_Stream':
sfnt.c:(.text+0x9d59): undefined reference to `png_get_io_ptr'
/usr/bin/ld: sfnt.c:(.text+0x9d95): undefined reference to `png_get_error_ptr'
/usr/bin/ld: sfnt.c:(.text+0x9da5): undefined reference to `png_error'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(sfnt.c.o): in function `sfnt_init_face':
sfnt.c:(.text+0x1313e): undefined reference to `BrotliDecoderDecompress'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftbzip2.c.o): in function `ft_bzip2_stream_close':
ftbzip2.c:(.text+0x7d): undefined reference to `BZ2_bzDecompressEnd'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftbzip2.c.o): in function `ft_bzip2_file_fill_output':
ftbzip2.c:(.text+0x127): undefined reference to `BZ2_bzDecompress'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftbzip2.c.o): in function `ft_bzip2_stream_io':
ftbzip2.c:(.text+0x378): undefined reference to `BZ2_bzDecompressEnd'
/usr/bin/ld: ftbzip2.c:(.text+0x3c7): undefined reference to `BZ2_bzDecompressInit'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftbzip2.c.o): in function `FT_Stream_OpenBzip2':
ftbzip2.c:(.text+0x604): undefined reference to `BZ2_bzDecompressInit'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftgzip.c.o): in function `ft_gzip_stream_close':
ftgzip.c:(.text+0x1dd): undefined reference to `inflateEnd'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftgzip.c.o): in function `ft_gzip_file_fill_output':
ftgzip.c:(.text+0x2b1): undefined reference to `inflate'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftgzip.c.o): in function `ft_gzip_file_io':
ftgzip.c:(.text+0x505): undefined reference to `inflateReset'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftgzip.c.o): in function `FT_Stream_OpenGzip':
ftgzip.c:(.text+0x6b1): undefined reference to `inflateInit2_'
/usr/bin/ld: ftgzip.c:(.text+0x85f): undefined reference to `inflateEnd'
/usr/bin/ld: /home/ilmu011/Desktop/vcpkg/installed/x64-linux/lib/libfreetype.a(ftgzip.c.o): in function `FT_Gzip_Uncompress':
ftgzip.c:(.text+0x984): undefined reference to `inflateInit2_'
/usr/bin/ld: ftgzip.c:(.text+0x998): undefined reference to `inflate'
/usr/bin/ld: ftgzip.c:(.text+0x9a7): undefined reference to `inflateEnd'
/usr/bin/ld: ftgzip.c:(.text+0xa1c): undefined reference to `inflateEnd'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/CylinderExample.dir/build.make:145: CylinderExample] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/CylinderExample.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

When I try to do this with the built-from-source installation (9.1), nothing changes. make simply does nothing. But it looks like, in that case, cmake doesn’t even recognize vtk at all. I tried leaving out the vtk directory to the installation and no errors where thrown. I begin to suspect that cmake doesn’t even find vtk in the first place and weirdly doesn’t even throw any error messages

I also just tried to add

set(VTK_MODULE_ENABLE_VTK_RenderingContextOpenGL2 YES)

to my cmake file and also tried it with the command line option, but the missing module error still ocurs (in the vcpkg installation; the source installation stil seems to be unrecognized for whatever reason)

To get rid of the “undefined reference” errors, try removing vtkRenderingFreeType from the COMPONENTS as well. I say this because all of the warnings mention libfreetype.a.

There must be something wrong with the vcpkg for VTK, because if the package was correct, then vtkRenderingFreeType would automatically link to libpng and to all the other libraries that libfreetype needs.

Please note that I don’t have any experience with vcpkg, so my answers might not be correct.

Edit: another possibility is that you have more than one libfreetype installed on your system, and cmake is finding the wrong one. For example, maybe one libfreetype was installed from a ubuntu package and another from vcpkg.

That didn’t solve the problem either.

Fine, let’s say the vcpkg version is broken, I still don’t understand how cmake seems to completely ignore the source installation despite me providing the installation directory. It doesn’t even throw error messages, it simply does nothing.

I built the source installation with the ccmake command, are there any settings I had to adjust? For example, CMAKE_BUILD_TYPE is set to “Debug”, shouldn’t that be Release? Is that even important? I have no idea how to make this work. I followed every step of the installation steps prvided here:

At this point I am just trying to get a working VTK installation.

I just checked libfreetype installations, it seems to be the case that there is both an apt installation and a vcpkg one. But which is the right one and how do I make it so that the right one is used?

Regarding the source installation: I just checked the CMakeCache.txt in the build folder. I found this entry:

//The directory containing a CMake configuration file for VTK.

The directory I specified isn’t applied. Am I giving cmake the wrong directory? I just assumed (following the build directions) I had to point to “vtk/build”. The instructions say

If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:

cmake -DVTK_DIR:PATH=/home/me/vtk_build ..

…but this clearly failed

I just found out, that I was using the wrong directory all along. I had to specify the directory containing the config-cmake file for vtk like this:

cmake -S source -B build -DVTK_DIR:PATH=/home/ilmu011/Desktop/vtk/build/lib/cmake/vtk-9.1

However, now I get a massive error log:

The error log is because VTK wasn’t built, so all of the library targets that cmake needs are missing.

For now, I suggest going back to the vcpkg vtk, because if that works, it will be the simplest way forward.

The problem there was libfreetype and the missing symbols, so try re-configuring your example against the vcpkg vtk, and then look through the generated CMakeCache.txt for freetype and other system libraries, and make sure they point to the apt-installed libraries. E.g.:


It’s fine if the “DEBUG” versions of these libraries are “NOTFOUND”. I also recommend setting CMAKE_BUILD_TYPE to Release unless you specifically intend to run the example in a debugger.

Where would I configure these things? In the CMakeLists.txt? Like
set(FREETYPE_INCLUDE_DIR_freetype2 "/usr/include/freetype2")

Also, is it really more complicated to just build the VTK from source?
The instructions used ccmake for this step, but I’m not familiar with that tool and probably missed some steps

I did check the Cache and it turns out it DOES point to the vcpkg installation. However, isn’t this the point? I thought vcpkg handled dependencies like these automatically. How is it possible that this version is incompatible with vtk?

I just edited my CMakeLists.txt, it now looks like this:

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)


set(CMAKE_TOOLCHAIN_FILE /home/ilmu011/Desktop/vcpkg/scripts/buildsystems/vcpkg.cmake CACHE STRING "")



set(FREETYPE_INCLUDE_DIR_freetype2 "/usr/include/freetype2")
set(FREETYPE_INCLUDE_DIR_ft2build "/usr/include/freetype2")
set(FREETYPE_LIBRARY_RELEASE "/usr/lib/x86_64-linux-gnu/")

project(CylinderExample, LANGUAGES CXX)

find_package(VTK COMPONENTS 
  # vtkRenderingContextOpenGL2
  # vtkRenderingGL2PSOpenGL2

  message("Skipping CylinderExample: ${VTK_NOT_FOUND_MESSAGE}")
  # old system
  add_executable(CylinderExample MACOSX_BUNDLE CylinderExample.cxx )
  target_link_libraries(CylinderExample PRIVATE ${VTK_LIBRARIES})
  # Prevent a "command line is too long" failure in Windows.
  set(CMAKE_NINJA_FORCE_RESPONSE_FILE "ON" CACHE BOOL "Force Ninja to use response files.")
  add_executable(CylinderExample MACOSX_BUNDLE CylinderExample.cxx )
  target_link_libraries(CylinderExample PRIVATE ${VTK_LIBRARIES})
  # vtk_module_autoinit is needed
    TARGETS CylinderExample

However, the INCLUDE_DIRS seem to not have been apllied correctly… from the Cache:

//Path to a file.

//Path to a file.

//Path to a library.

//Path to a file.

How do I do this correctly?

The easiest way (quick and dirty) to set the cache variables is to edit the CMakeCache.txt file directly, and then re-run cmake. But this has to be repeated each time you do a clean build, so it’s not ideal.

Another way is by passing multiple -D values when you run cmake, one for each variable. This can be tedious, but you can put the whole cmake command-line into a bash script to make it reusable.

For putting cache variables into a CMakeLists.txt, it’s necessary to use the CACHE keyword in the set() command:


syntax: (note that <docstring> can be an empty string)

set(<variable> <value> CACHE <type> <docstring> [FORCE])

Instead of putting these in the CMakeLists.txt, they can be put in their own cmake file, e.g. a file called cache.cmake that is used like this:

cmake -C cache.cmake ...

where cache.cmake contains


It’s verbose, which is why using -D is more common.

Make sure that you have libfreetype-dev installed, it’s possible that cmake didn’t automatically find the system libs and headers for freetype because they’re not installed on your system.

Hopefully someone else can answer the vcpkg questions, because I don’t really know anything about it, except that it exists.

1 Like

Thanks for your detailed answer.

If I wanted to pass multiple arguments with the -D option in the command line, how would I do that? I thought I just had to sperate them with a semicolon, but this didn’t work:

cmake -S source -B build -DFREETYPE_INCLUDE_DIR_freetype2:PATH=/usr/include/freetype2;FREETYPE_INCLUDE_DIR_ft2build:PATH=/usr/include/freetype2;FREETYPE_LIBRARY_DEBUG:FILEPATH=FREETYPE_LIBRARY_DEBUG-NOTFOUND;FREETYPE_LIBRARY_RELEASE:FILEPATH=/usr/lib/x86_64-linux-gnu/