2014-12-27 3 views
6

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

#include <Python.h> 

int 
main(int argc, char *argv[]) 
{ 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 
    PyRun_SimpleString("from time import time, ctime\n" 
        "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-конфигурации дает следующий вывод на моей машине 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

Попробуйте включить '-I/usr/include/python2.7 -lpython2.7' в строку компиляции – kilojoules

+0

первый из них уже существует и добавление -lpython2.7 в строку компиляции, похоже, ничего не делает. Он компилируется в объектный файл, как и раньше, но он не связан правильно. -lpython2.7 также уже добавлен во вторую команду gcc для связи – Miguellissimo

+1

. Я смог связать C-программу python [здесь] (http://stackoverflow.com/questions/3286448/calling-a-python-method- из-CC-и-извлечения-ее-возвратного значение/24687260 # 24687260). Хотя это загружает модуль не целую программу, возможно, это поможет. – kilojoules

ответ

11

Библиотеки должны прийти после того, как объектные файлы, когда вы ссылаетесь, так что:

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

Это не работает для python3.5 –

+0

CC = gcc CCFLAGS = -I /usr/include/python3.5/ -I /usr/lib/python3.5/config-3.5m-x86_64-linux-gnu/ - с -w -lpython3.5 LLFLAGS = $ (/ USR/бен/python3.5-конфигурации --ldflags) все: \t $ (CC) $ (CCFLAGS) TerrainPredict.c \t $ (CC) TerrainPredict.o $ (LLFLAGS) –

0

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

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

C++ Code ::

#include "python2.7/Python.h" 

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

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

    Py_Finalize(); 
    return 0; 
} 

Ошибки ::

test.o: В функции main': /home/ros/workspace/test/src/test.cpp:15: undefined reference to Py_Initialize» /дома/ROS/рабочее пространство/тест/SRC/тест.CPP: 17: не определено ссылка на PyRun_SimpleStringFlags' /home/ros/workspace/test/src/test.cpp:18: undefined reference to Py_Finalize» collect2: Ошибка: ЛД возвращается 1 состояние выхода

Выход из следующих команд была такой же, как упоминалось ранее по Miguellissimo,

[email protected]:~/workspace/test/src$ python2.7-config --cflags 

-I/usr/include/python2.7 -I/usr/include/i386-linux-gnu/python2.7 -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes 

[email protected]:~/workspace/test/src$ python2.7-config --ldflags 

-L/usr/lib/python2.7/config-i386-linux-gnu -L/usr/lib -lpthread -ldl -lutil -lm -lpython2.7 -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions 

Свойства проекта С ++ Затмение под названием "тест" Project ::

Внутри я имел следующий C++ Строят Параметры

GCC C++ Compiler

Command: g++ 

All options: -I/opt/ros/indigo/include -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 

GCC C Compiler

Command: gcc 

All options: -I/opt/ros/indigo/include -I/usr/lib/python2.7/config-i386-linux-gnu -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/lib/python2.7/config-i386-linux-gnu 

GCC C++ Linker

Command: g++ 

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

Libraries: 

    Libraries(-I): 

    Library search path(-L): 

Решение ::

указано следующее C++ Построить Настройки в проектном свойств C++ проекта Eclipse "тест"

Компилятор 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 Compiler

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 C++ Linker

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, не происходит больше.