Выполнение модуля C ++ CGAL, который вызывается из Python

0

Я пытаюсь скомпилировать код C++, который должен вызываться из Python, а затем вызывает CGAL.

Мне нужно указать некоторые флаги в компиляции, но не уверен, как это сделать, поскольку процесс сборки

./CGAL-4.2/scripts/cgal_create_CMakeLists -s CallGCAL

cmake -DCGAL_DIR=./CGAL-4.2 .

make

И я не хочу, чтобы вручную редактировать Makefile или CMakeLists

Сообщение об ошибке, которое я получаю сверху без Flags, чтобы сообщить gcc, что ему нужен Python

CMakeFiles/CallGCAL.dir/CallGCAL.cpp.o: In function 'initmyModule()':
CallGCAL.cpp:(.text+0x5e): undefined reference to 'Py_InitModule4'
CMakeFiles/CallGCAL.dir/CallGCAL.cpp.o: In function 'py_polygon(_object*, _object*)':
CallGCAL.cpp:(.text+0x86): undefined reference to 'Py_BuildValue'
CMakeFiles/CallGCAL.dir/CallGCAL.cpp.o: In function 'py_hull(_object*, _object*)':
CallGCAL.cpp:(.text+0xa6): undefined reference to 'Py_BuildValue'
collect2: ld returned 1 exit status
Теги:
cgal

3 ответа

1

Хорошо, решено !!! Пришлось передать переменную cmake.

Рабочий скрипт выглядит следующим образом.

./CGAL-4.2/scripts/cgal_create_CMakeLists -s CallCGAL

cmake -DCGAL_DIR =./CGAL-4.2 -DCGAL_CXX_FLAGS = "-s hared -f PIC".

делать

rm -f CallCGAL.so

mv CallCGAL CallCGAL.so

0

CMakeLists.txt, созданный cgal_create_CMakeLists совсем не предназначен для вашего случая использования. Созданный CMakeLists.txt пытается скомпилировать исполняемый файл, тогда как вы хотите создать модуль. В CMakeLists.txt замените строку:

create_single_source_cgal_program(CallCGAL.cpp)

от:

add_library(CallCGAL MODULE CallCGAL.cpp)
target_link_libraries(CallCGAL ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} )

Таким образом, CMake создаст правильный Makefile без необходимости переименовывать файл или настраивает фреймы компиляции и связывания.

  • 0
    Спасибо, но это значит, что когда я распространяю свой код, мне нужно, чтобы люди модифицировали скрипт CGAL. Думаю, я бы предпочел просто распространять свой скрипт компиляции, даже если он немного взломан
  • 0
    Обычным способом является распространение кроссплатформенного CMakeLists.txt с кодом. Это то, что мы делаем в CGAL.
Показать ещё 1 комментарий
0

Правильно ли я понимаю, что вы хотите скомпилировать свой собственный код, который использует как Python, так и CGAL, с помощью make файла, который поставляется вместе с CGAL?

Это, очевидно, невозможно, так как CGAL makefile не может знать о Python. Вы должны написать свой собственный файл makefile, который может быть основан на некоторых существующих make файлах, но также знает о Phython. Ошибка, о которой вы сообщаете, генерируется загрузчиком, который не может найти библиотеку Python для разрешения определенных символов. Таким образом, все, что вам нужно добавить в make файл, - это соответствующие -l и -l.

  • 0
    Не совсем. Я хочу скомпилировать свой собственный код, который вызывается из Python, но написан на C ++ и вызывает CGAL. CGAL не предоставляет Makefile напрямую. Он предоставляет различные сценарии, которые создают файлы CMAKEText, которые Cmake использует для создания MAkefile. С тех пор я нашел документацию по адресу cgal.org/Manual/latest/doc_html/installation_manual/…, в которой говорится о различных флагах компилятора компилятора, но я недостаточно знаю о сценариях CMAKE или CGAL, чтобы знать, где я должен устанавливать такие переменные.
  • 1
    Руководство, на которое вы ссылаетесь, является руководством по созданию библиотек CGAL (а также примерами и демонстрациями). Это не общее руководство по созданию другого программного обеспечения с использованием CGAL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню