Как связать библиотеки для вызова Python с C или C

#c #python-3.x

#c #python-3.x

Вопрос:

Я заинтересован в написании плагина GIMP, который вызывает библиотеку Python scikit-image. С этой целью я хотел бы вызвать Python из C. У меня возникли проблемы со связыванием библиотек. Я нашел то, что кажется библиотекой Python для C в моей системе. Путь в моей системе ~/.pyenv/versions/3.8.6/lib/libpython3.8.a. Когда я ссылаюсь на это, он разрешает вызовы, такие как PyDecodeLocale. Тем не менее, он по-прежнему содержит неопределенные ссылки на математические функции, такие как pow, atan2 и т. Д., А также на PyImport_FindSharedFuncptr и т. Д. Я не знаю, подходит ли эта библиотека для ссылки. Мой исходный код — это простой привет, мир:

 #define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stdio.h>
#include <math.h>

// #include "/home/anna_user2/.pyenv/versions/3.8.6/include/python3.8/Python.h"
int
main(int argc, char *argv[])
{
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    if (program == NULL) {
        fprintf(stderr, "Fatal error: cannot decode argv[0]n");
        exit(1);
    }
    Py_SetProgramName(program);  /* optional but recommended */
    Py_Initialize();
    PyRun_SimpleString("from time import time,ctimen"
                       "print('Today is', ctime(time()))n");
    if (Py_FinalizeEx() < 0) {
        exit(120);
    }
    PyMem_RawFree(program);
    return 0;
}
 

Комментарии:

1. Вам нужно связать libmath ( -lmath в gcc) для математических функций. Можете ли вы опубликовать команду, которую вы выполняете?

2. ссагпз hello.cpp -lmath ~/.pyenv/versions/3.8.6/lib/libpython3.8.a Он говорит, что не удается найти -lmath

3. gcc hello.cpp -Lmath ~/.pyenv/versions/3.8.6/lib/libpython3.8.a Он по-прежнему не может найти математические функции

4. Добиваюсь прогресса… он может находить математические функции, но не потоки, такие как pthread_sigmask. Команда, которую я использовал, — g hello.cpp -Lmath ~/.pyenv/versions/3.8.6/lib/libpython3.8.a

5. Пробовал g hello.cpp -LDFLAGS=-pthread -lpthread ~/.pyenv/версии/3.8.6/lib/libpython3.8.a

Ответ №1:

Это работает:

gcc -std=c11 -Wall -Wextra -pedantic -c -fPIC mylib.c -o mylib.o gcc -shared mylib.o -o mylib.so