Как создать скрипт CMAKE для создания приложения на C со встроенным Python?

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