0

I want to compile cpp source code in which VTK, Eigen, PETSc and dealII libraries are included. source files are located in src directory and header files in ìnclude directory.

The CMakeLists.txtfile is as follows:

cmake_minimum_required(VERSION 3.20.3)

project(ddm_library)

set (CMAKE_CXX_FLAGS "-Wsign-compare -Wno-unused-variable -Wno-unused-parameter -Wdeprecated-copy")

set(VTK_DIR /home/mehdi/myFolder/programming/lib/VTK-9.0.3/build)

# PkgConfig 
find_package(PkgConfig)

# PETSc
if (PKG_CONFIG_FOUND)
    pkg_check_modules(PETSC PETSc)
endif()


# include PETSC
if (PETSC_FOUND)
    list(APPEND COMPILE_OPTIONS ${PETSC_CFLAGS})

    include_directories(${PETSC_INCLUDE_DIRS})
    
    set(LINK_FLAGS "${LINK_FLAGS} ${PETSC_LDFLAGS}")   
    
    list(APPEND LIBRARIES ${PETSC_LINK_LIBRARIES})   
    
    set(CMAKE_REQUIRED_FLAGS ${PETSC_CFLAGS})   
    
    set(CMAKE_REQUIRED_INCLUDES "${PETSC_INCLUDE_DIRS}")
endif()


# include Eigen
find_package (Eigen3 3.3 REQUIRED NO_MODULE)

# VTK library
find_package(VTK COMPONENTS
  vtkCommonColor
  vtkCommonCore
  vtkCommonDataModel
  vtkInteractionStyle
  vtkRenderingContextOpenGL2
  vtkRenderingCore
  vtkRenderingFreeType
  vtkRenderingGL2PSOpenGL2
  vtkRenderingOpenGL2
  vtkCommonCore
  vtkCommonDataModel
  vtkIOXML
  QUIET
)

if (NOT VTK_FOUND)
  message("Skipping StructuredGrid: ${VTK_NOT_FOUND_MESSAGE}")
  return ()
endif()

message (STATUS "VTK_VERSION: ${VTK_VERSION}")


# dealII
FIND_PACKAGE(deal.II 9.3.0 QUIET
  HINTS ${deal.II_DIR} ${DEAL_II_DIR} ../ ../../ $ENV{DEAL_II_DIR}
  )

IF(NOT ${deal.II_FOUND})
  MESSAGE(FATAL_ERROR "\n"
    "*** Could not locate a (sufficiently recent) version of deal.II. ***\n\n"
    "You may want to either pass a flag -DDEAL_II_DIR=/path/to/deal.II to cmake\n"
    "or set an environment variable \"DEAL_II_DIR\" that contains this path."
    )
ENDIF()

DEAL_II_INITIALIZE_CACHED_VARIABLES()

if (VTK_VERSION VERSION_LESS "8.90.0")
  # old system
  INCLUDE_DIRECTORIES(include ${VTK_USE_FILE} ${VTK_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIR})

  file (GLOB LIB "src/*.cc")

  ADD_LIBRARY(lib ${LIB})

  vtk_module_autoinit(
    TARGETS lib
    MODULES ${VTK_LIBRARIES}
    )

  DEAL_II_SETUP_TARGET(lib)

  add_executable(${PROJECT_NAME} MACOSX_BUNDLE "test/main.cc")

  DEAL_II_SETUP_TARGET(${PROJECT_NAME})
  
  target_link_libraries(${PROJECT_NAME} PRIVATE lib Eigen3::Eigen ${VTK_LIBRARIES})

else ()
  # include all components
  INCLUDE_DIRECTORIES(include ${VTK_USE_FILE} ${VTK_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIR})

  file (GLOB LIB "src/*.cc")

  ADD_LIBRARY(lib ${LIB})

  vtk_module_autoinit(
    TARGETS lib
    MODULES ${VTK_LIBRARIES}
    )

    DEAL_II_SETUP_TARGET(lib)
  add_executable(${PROJECT_NAME} MACOSX_BUNDLE "test/main.cc")

  DEAL_II_SETUP_TARGET(${PROJECT_NAME})
  
  target_link_libraries(${PROJECT_NAME} PRIVATE lib Eigen3::Eigen ${VTK_LIBRARIES})

  # vtk_module_autoinit is needed
  vtk_module_autoinit(
    TARGETS ${PROJECT_NAME}
    MODULES ${VTK_LIBRARIES}
    )
endif ()

running cmd like

$ cmake -DCMAKE_BUILD_TYPE=Debug ..

-- The C compiler identification is GNU 11.1.0
-- The CXX compiler identification is GNU 11.1.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
-- Found PkgConfig: /usr/bin/pkg-config (found version "1.7.3") 
-- Checking for module 'PETSc'
--   Found PETSc, version 3.15.0
-- VTK_VERSION: 9.0.3
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mehdi/myFolder/programming/domain_decomposition/build

which finds all the packages. Then running the cmd

$ make
cc1plus: warning: /home/mehdi/myFolder/programming/lib/VTK-9.0.3/build/lib/cmake/vtk-9.0/vtk-use-file-deprecated.cmake: not a directory
In file included from /home/mehdi/myFolder/programming/domain_decomposition/src/post_processing.cc:2:
/home/mehdi/myFolder/programming/domain_decomposition/include/post_processing.hpp:14:10: fatal error: vtkActor.h: No such file or directory
   14 | #include <vtkActor.h>
      |          ^~~~~~~~~~~~

I can not understand why I got such a error.

arrowd
  • 33,231
  • 8
  • 79
  • 110
mehdi_bm
  • 381
  • 1
  • 3
  • 16

1 Answers1

0

I modified the CMakeLists.txtby removing PRIVATEfrom target_link_librariesand add target_link_librariesfor lib, and the problem solved. The new CMakeLists.txt is look like this:

cmake_minimum_required(VERSION 3.20.3)

project(ddm_library)

set (CMAKE_CXX_FLAGS "-Wsign-compare -Wno-unused-variable -Wno-unused-parameter -Wdeprecated-copy")

set(VTK_DIR /home/mehdi/myFolder/programming/lib/VTK-9.0.3/build)

# PkgConfig 
find_package(PkgConfig)

# PETSc
if (PKG_CONFIG_FOUND)
    pkg_check_modules(PETSC PETSc)
endif()


# include PETSC
if (PETSC_FOUND)
    list(APPEND COMPILE_OPTIONS ${PETSC_CFLAGS})

    include_directories(${PETSC_INCLUDE_DIRS})
    
    set(LINK_FLAGS "${LINK_FLAGS} ${PETSC_LDFLAGS}")   
    
    list(APPEND LIBRARIES ${PETSC_LINK_LIBRARIES})   
    
    set(CMAKE_REQUIRED_FLAGS ${PETSC_CFLAGS})   
    
    set(CMAKE_REQUIRED_INCLUDES "${PETSC_INCLUDE_DIRS}")
endif()


# include Eigen
find_package (Eigen3 3.3 REQUIRED NO_MODULE)

# VTK library
find_package(VTK COMPONENTS
  vtkCommonColor
  vtkCommonCore
  vtkCommonDataModel
  vtkInteractionStyle
  vtkRenderingContextOpenGL2
  vtkRenderingCore
  vtkRenderingFreeType
  vtkRenderingGL2PSOpenGL2
  vtkRenderingOpenGL2
  vtkCommonCore
  vtkCommonDataModel
  vtkIOXML
  QUIET
)

if (NOT VTK_FOUND)
  message("Skipping StructuredGrid: ${VTK_NOT_FOUND_MESSAGE}")
  return ()
endif()

message (STATUS "VTK_VERSION: ${VTK_VERSION}")


# dealII
FIND_PACKAGE(deal.II 9.3.0 QUIET
  HINTS ${deal.II_DIR} ${DEAL_II_DIR} ../ ../../ $ENV{DEAL_II_DIR}
  )

IF(NOT ${deal.II_FOUND})
  MESSAGE(FATAL_ERROR "\n"
    "*** Could not locate a (sufficiently recent) version of deal.II. ***\n\n"
    "You may want to either pass a flag -DDEAL_II_DIR=/path/to/deal.II to cmake\n"
    "or set an environment variable \"DEAL_II_DIR\" that contains this path."
    )
ENDIF()

DEAL_II_INITIALIZE_CACHED_VARIABLES()

#INCLUDE_DIRECTORIES(SYSTEM ${VTK_INCLUDE_DIRS})

if (VTK_VERSION VERSION_LESS "8.90.0")
  # old system
  INCLUDE_DIRECTORIES(include ${VTK_USE_FILE} ${VTK_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIR})

  FILE (GLOB LIB "src/*.cc")

  ADD_LIBRARY(lib OBJECT ${LIB})

  vtk_module_autoinit(
     TARGETS lib
    MODULES ${VTK_LIBRARIES}
    )

  TARGET_LINK_LIBRARIES(lib Eigen3::Eigen ${VTK_LIBRARIES})
  
  DEAL_II_SETUP_TARGET(lib)

  add_executable(${PROJECT_NAME} MACOSX_BUNDLE "test/main.cc")

  DEAL_II_SETUP_TARGET(${PROJECT_NAME})
  
  TARGET_LINK_LIBRARIES(${PROJECT_NAME} lib Eigen3::Eigen ${VTK_LIBRARIES})

else ()
  # include all components
  INCLUDE_DIRECTORIES(include ${VTK_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIR})

  FILE (GLOB LIB "src/*.cc")

  ADD_LIBRARY(lib OBJECT ${LIB})

  vtk_module_autoinit(
     TARGETS lib
    MODULES ${VTK_LIBRARIES}
    )

  TARGET_LINK_LIBRARIES(lib Eigen3::Eigen ${VTK_LIBRARIES})
  DEAL_II_SETUP_TARGET(lib)
  
  add_executable(${PROJECT_NAME} MACOSX_BUNDLE "test/main.cc")

  DEAL_II_SETUP_TARGET(${PROJECT_NAME})
  
  TARGET_LINK_LIBRARIES(${PROJECT_NAME} lib Eigen3::Eigen ${VTK_LIBRARIES})
  
  # vtk_module_autoinit is needed
  vtk_module_autoinit(
    TARGETS ${PROJECT_NAME}
    MODULES ${VTK_LIBRARIES}
    )
endif ()
mehdi_bm
  • 381
  • 1
  • 3
  • 16