Встраивание Python в C, связывание не удается с неопределенной ссылкой на 'Py Initialize'

Я пытаюсь скомпилировать пример из docs https://docs.python.org/2.7/extending/embedding.html и мой код выглядит точно так же, как под 5.1:

#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_SetProgramName(argv[0]);
  Py_Initialize();
  PyRun_SimpleString("from time import time, ctimen"
                     "print 'Today is', ctime(time())n");

  Py_Finalize();
  return 0;
}

Я использую следующую команду для компиляции, которая отлично работает для меня и дает мне нужный объектный файл:

gcc -c $(python2.7-config --cflags) embedpy.c

чтобы связать его, я использую следующую команду, которая заканчивается следующей ошибкой:

gcc $(/usr/bin/python2.7-config --ldflags) embedpy.o
embedpy.o: In function `main':
/home/miguellissimo/embedpy.c:6: undefined reference to `Py_SetProgramName'
/home/miguellissimo/embedpy.c:7: undefined reference to `Py_Initialize'
/home/miguellissimo/embedpy.c:8: undefined reference to `PyRun_SimpleStringFlags'
/home/miguellissimo/embedpy.c:11: undefined reference to `Py_Finalize'
collect2: error: ld returned 1 exit status

Я не могу выяснить, что я делаю неправильно или что я забыл чтобы заставить пример работать.

PS: python2.7-config команда дает следующие выходные данные на моей машине Xubuntu:

>>> python2.7-config --cflags 
-I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7  -fno-stri
ct-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=
4 -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-pr
ototypes

>>> python2.7-config --ldflags
-L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpthread -ldl  -luti
l -lm  -lpython2.7 -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions 

2 ответов


библиотеки должны приходить после объектных файлов, когда вы связываете, поэтому сделайте:

gcc  embedpy.o $(/usr/bin/python2.7-config --ldflags)

я повторил ту же проблему на Lubuntu14.04 32-битная виртуальная машина, работающая на машине Win7.

я сделал следующие вещи, чтобы реплицировать проблему в первую очередь, когда код c++ написан в Eclipse C/C++ IDE. Определен проект Eclipse на C++ под названием "test". Исходный файл содержит следующий код C++, который совпадает с упомянутым выше Miguellissimo.

C++ Кода ::

#include "python2.7/Python.h"

int main(int argc, char *argv[]) {

    Py_Initialize();
    PyRun_SimpleString("print \"Hello, world!\"");

    Py_Finalize();
    return 0;
}

ошибки ::

компилятор GCC C++

Command: g++

All options: -I/opt/ros/indigo/include -I/usr/include/python2.7 -O0 -g3 -Wall -c -fmessage-length=0

Command line pattern: ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

Includes
    include paths: /opt/ros/indigo/include
                   /usr/include/python2.7

на GCC компилятор C

Command: gcc

All options: -I/opt/ros/indigo/include -I/usr/include/python2.7 -O0 -g3 -Wall -c -fmessage-length=0

Command line pattern: ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

Includes
    include paths: /opt/ros/indigo/include
                   /usr/include/python2.7

GCC и с++ Компоновщик

Command: g++

All options: -L/usr/lib/python2.7/config-i386-linux-gnu

Command line pattern: ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

Libraries:

    Libraries(-I): python2.7

    Library search path(-L): /usr/lib/python2.7/config-i386-linux-gnu

результат:: ошибки компоновщика, которые ранее возникали в результате компиляции проекта C++ Eclipse, больше не возникают.