2013-10-12 2 views
0

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

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

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

cmake -DCGAL_DIR=./CGAL-4.2 . 

make 

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

сообщение об ошибке я получаю от выше, без флагов сказать 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 

ответ

0

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

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

+0

Не совсем. Я хочу скомпилировать свой собственный код, который вызывается из Python, но написан на C++ и вызывает CGAL. CGAL не предоставляет Makefile напрямую. Он предоставляет различные сценарии, которые создают файлы CMAKEText, которые Cmake использует для создания файла MAkefile. С тех пор я нашел документацию по адресу http://www.cgal.org/Manual/latest/doc_html/installation_manual/Chapter_installation_manual.html#Subsection_16.2, где говорится о различных флагах компоновщика компилятора, но я недостаточно знаю о сценариях CMAKE или CGAL знать, где я должен устанавливать такие переменные. –

+1

В данном руководстве вы найдете руководство по созданию библиотек CGAL (и примеров и демонстраций). Это не общее руководство для создания другого программного обеспечения с использованием CGAL. – lrineau

1

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

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

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

CMake -DCGAL_DIR =/CGAL-4,2 -DCGAL_CXX_FLAGS = "- общий -fPIC".

сделать

гт -f CallCGAL.so

мв 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. – lrineau

+0

Обратите также внимание на то, что вы можете создать модуль с помощью CGAL без его настройки с помощью CMake. Но вам придется внедрять систему сборки самостоятельно. CMake - это просто кросс-платформенный способ создания систем сборки для данной части программного обеспечения. – lrineau

Смежные вопросы