CGAL::CGAL включен CMakiLists.txt

#c #cmake #cgal

#c #cmake #cgal

Вопрос:

Я являюсь пользователем сервера CentOS 6, и администратор был достаточно любезен, чтобы установить CGAL на нем. Сначала я опишу CMakeLists.txt на моей локальной машине, для которой все работает, и тогда мой вопрос был бы в том, почему то же самое не работает на сервере. На моем ноутбуке у меня есть проект, в котором используется пример EMST https://doc.cgal.org/latest/BGL/BGL_triangulation_2_2emst_8cpp-example.html. «Самый внешний» CMakeLists.txt имеет find_package(CGAL) и специфическую CMakeLists.txt имеет это:

 add_executable(emst emst.cpp)
target_compile_options(emst BEFORE PUBLIC -mcmodel=large PRIVATE -pg -g -O2)
target_link_libraries(emst CGAL::CGAL)
  

Все это «работает на моей машине» (c). Обычно я выполняю выпуск в каталоге сборки проекта cmake ../ , а затем в подкаталоге, специфичном для emst make emst (конечно, все это делается соответствующим щелчком мыши внутри CLion).
Теперь эта самая настройка не работает на сервере.
Я получаю ошибки, подобные этим:

 /emst.cpp:99:44: error: no matching function for call to ‘source(edge_descriptoramp;, Triangulationamp;)’
         vertex_descriptor svd = source(ed,t);
                                            ^
In file included from /usr/include/CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h:25:0,
  

Администратор сказал мне это:

библиотеки можно найти в /usr/lib64, а заголовочные файлы — в /usr/include/CGAL.

В какой-то момент, во время cmake ../ -фазы на сервере, я получаю сообщение, подобное этому:

Предупреждение CMake (dev) в utils/CMakeLists.txt:31 (add_executable):
Политика CMP0028 не установлена: Двойное двоеточие в имени цели означает ПСЕВДОНИМ или ИМПОРТИРОВАННЫЙ целевой объект. Запустите «cmake —help-policy CMP0028» для получения подробной информации о политике. Используйте команду cmake_policy, чтобы установить политику и подавить это предупреждение.

Цель «emst» ссылается на цель «CGAL::CGAL», но цель не была найдена. Возможно, для ИМПОРТИРОВАННОГО целевого объекта отсутствует вызов find_package() или целевой псевдоним отсутствует? Это предупреждение для разработчиков проекта. Используйте -Wno-dev для его подавления.

Я попытался find_package(CGAL REQUIRED) для того, чтобы он выдавал ошибку, если не найден. Похоже, что пакет найден. Что здесь может пойти не так?

Комментарии:

1. Какая версия CGAL на сервере? до версии 4.12 вам необходимо использовать use_file, как описано разработчиком Полом.

Ответ №1:

Исходя из моего опыта работы с CGAL, вам необходимо включить use file: include(${CGAL_USE_FILE}) и тогда вы сможете использовать целевые объекты по мере необходимости. Судя по выходному сообщению, похоже, что CGAL не найден, поскольку целевой объект CGAL::CGAL не существует.

Итак, в основном вам нужно:

 
find_package(CGAL)

# .. other code

include(${CGAL_USE_FILE})

add_executable(myexe ...)

target_link_libraries(myexe 
    PUBLIC
        CGAL::CGAL
        CGAL::CGAL_Core # and so on...
)
  

Комментарии:

1. Если вы включаете файл use, вам необходимо использовать переменные XXX_LIBS. Целевой CGAL::CGAL является заменой USE_FILE.