Я пытаюсь скомпилировать код 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
Хорошо, решено !!! Пришлось передать переменную 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
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 без необходимости переименовывать файл или настраивает фреймы компиляции и связывания.
Правильно ли я понимаю, что вы хотите скомпилировать свой собственный код, который использует как Python, так и CGAL, с помощью make файла, который поставляется вместе с CGAL?
Это, очевидно, невозможно, так как CGAL makefile не может знать о Python. Вы должны написать свой собственный файл makefile, который может быть основан на некоторых существующих make файлах, но также знает о Phython. Ошибка, о которой вы сообщаете, генерируется загрузчиком, который не может найти библиотеку Python для разрешения определенных символов. Таким образом, все, что вам нужно добавить в make файл, - это соответствующие -l
и -l
.