#c #cmake
#c #cmake
Вопрос:
Чтобы скомпилировать приложение на C со встроенным Python, для простого проекта s отлично работает следующее:
gcc -std=c99 -ggdb3 -O0 -pedantic-errors -Wall -Wextra
-fpie $(/opt/python/38/bin/python3-config --cflags --embed) -o 'app'
'main.c' $(/opt/python/38/bin/python3-config --embed --ldflags)
Для компиляции и запуска этого кода:
#define PY_SSIZE_T_CLEAN
#include <python3.8/Python.h>
int main(int argc, char *argv[]) {
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
Py_SetProgramName(program);
Py_Initialize();
PyRun_SimpleString("print(list(range(0,5)))");
if (Py_FinalizeEx() < 0) {
exit(120);
}
PyMem_RawFree(program);
return 0;
}
Как бы вы это создали с помощью CMAKE?
Пробовал:
cmake_minimum_required(VERSION 3.17)
project(app C)
set(CMAKE_C_STANDARD 99)
add_executable(app main.c)
execute_process(COMMAND python3-config --cflags --embed OUTPUT_VARIABLE PY_CFLAGS)
execute_process(COMMAND python3-config --ldflags --embed OUTPUT_VARIABLE PY_LDFLAGS)
SET(PY_CFLAGS "-std=c99 -ggdb3 -O0 -pedantic-errors -Wall -Wextra -fpie ${PY_CFLAGS}")
SET(GCC_COVERAGE_LINK_FLAGS "${PY_LDFLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PY_CFLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PY_LDFLAGS}")
Но не работает и заканчивается: неопределенной ссылкой на `main’.
Любой совет
Комментарии:
1. Привязка должна выполняться через
target_link_libraries
, настройкаCMAKE_EXE_LINKER_FLAGS
недостаточна для этой цели. Вызовитеpython3-config
с--libs
опцией и используйте ее вывод (после удаления возможного-l
префикса) вtarget_link_libraries
вызове.2. Большое вам спасибо, это привело меня к правильному ответу. CMAKE — ужасно документированный инструмент. Большое вам спасибо.
Ответ №1:
Вот рабочий скрипт CMAKE, который успешно компилирует программу на C, в которую встроен Python (через #include <Python.h>)
cmake_minimum_required(VERSION 3.17)
project(myapp C)
set(CMAKE_C_STANDARD 99)
add_executable(myapp main.c)
include_directories(/opt/python/38/include/python3.8)
link_directories(/opt/python/38/lib)
target_link_libraries(myapp python3.8 crypt pthread dl util m)