Неопределенная ссылка на `PyString_FromString '

У меня есть код C:

... [SNIP] ... for(Node = Plugin.Head; Node != NULL; Node = Node->Next) { //Create new python sub-interpreter Node->Interpreter = Py_NewInterpreter(); if(Node->Interpreter == NULL) { Die("Py_NewInterpreter() failed"); } //Create path to plugins main source file snprintf(Filename, FILENAME_MAX, "%s/main.py", Node->File); //Convert filename to python string PFilename = PyString_FromString(Filename); if(PFilename == NULL) { Die("PyString_FromString(%s) failed", Filename); } //Import plugin main source file PModule = PyImport_Import(PFilename); if(PModule == NULL) { Die("PyImport_Import(%s) failed", Filename); } //Deallocate filename Py_DECREF(PFilename); //Get reference to onLoad function from module PFunction = PyObject_GetAttrString(PModule, "onLoad"); if(PFunction == NULL) { Die("PyObject_GetAttrString() failed"); } } ... [SNIP] ... 

Что дает эту ошибку при компиляции:

 /tmp/ccXNmyPy.o: In function `LoadPlugins': /home/alex/Code/Scribe/Scribe.c:693: undefined reference to `PyString_FromString' collect2: error: ld returned 1 exit status 

Python.h включен в начало исходного файла.

Я компилирую с:

 gcc -funwind-tables -rdynamic -I /usr/include/python2.7/ -g -o Scribe Scribe.c -lcurses `python-config --cflags` `python-config --ldflags` -Wall 

Я основываю код на документах Python C-Api, отсюда:

http://docs.python.org/2/c-api/

В частности:

http://docs.python.org/2/c-api/string.html?highlight=pystring_fromstring#PyString_FromString

Я понятия не имею, почему это происходит, остановка? = с

2 Solutions collect form web for “Неопределенная ссылка на `PyString_FromString '”

Решил его, благодаря некоторой помощи от мартино.

Оказывается, python-config --cflags и python-config --ldflags генерируют флаги, которые включают каталог python3.3 include в пути поиска и связаны с python3.3 lib.

Естественно, python3.3 не так хорошо работает с python2.7 C-API, что и вызвало эту проблему.

Моим решением было скопировать вывод python-config --cflags и python-config --ldflags и отредактировать его, чтобы он включал python2.7 вместо python3.3m:

 -I/usr/include/python2.7 -I/usr/include/python2.7 -Wno-unused-result -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic 

Вместо:

 -I/usr/include/python3.3m -I/usr/include/python3.3m -Wno-unused-result -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -lpthread -ldl -lutil -lm -lpython3.3m -Xlinker -export-dynamic 

Порядок библиотек важен. Попробуйте выполнить компиляцию с -lpython2.7, появляющимся последним в списке библиотек.

  • Доступ к низкоуровневым регистрам встроенного устройства с использованием Python
  • Является ли хорошей идеей для меня изучать Python до C или другого языка компилятора?
  • Есть ли какая-нибудь библиотека в C, как проверка python?
  • Как программно перечислить зависимости DLL в C ++ или Python?
  • Преобразование std :: vector в массив NumPy без копирования данных
  • Комплексные числа в Китоне
  • Python эквивалент vector :: reserve ()
  • Создать экземпляр класса python, объявленного в python, с API C
  • Python - лучший язык программирования в мире.