#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