#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.