2012-04-07 15 views
6

Compilo un código de prueba con g ++ sin ningún problema.g ++ con python.h, cómo compilar

#include "Python.h" 

int main(int argc, char** argv) 
{ 
    Py_Initialize(); 
    PyRun_SimpleString("import pylab"); 
    PyRun_SimpleString("pylab.plot(range(5))"); 
    PyRun_SimpleString("pylab.show()"); 
    Py_Exit(0); 
} 

g++ -o test test.cpp -I/usr/include/python2.7/ -lpython2.7 funciona bien y corre.

Pero cuando intento insertar este código en otro proyecto, falla. Realmente me confunde.

Makefile es como el siguiente.

CXX=g++ 
CXXFLAGS=-DIB_USE_STD_STRING -Wall -Wno-switch -g 
ROOT_DIR=.. 
BASE_SRC_DIR=${ROOT_DIR}/PosixSocketClient 
INCLUDES=-I${ROOT_DIR}/Shared/ -I${BASE_SRC_DIR} -I/usr/include/python2.7 
LIBRARY=-L/usr/lib/python2.7/config 
TARGET=eu 

$(TARGET): 
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o EClientSocketBase.o -c $(BASE_SRC_DIR)/EClientSocketBase.cpp 
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o EPosixClientSocket.o -c $(BASE_SRC_DIR)/EPosixClientSocket.cpp 
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o PosixTestClient.o -c PosixTestClient.cpp 
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o Main.o -c Main.cpp 
    $(CXX) $(LIBRARY) -lpython2.7 -o [email protected] EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o Main.o 

clean: 
    rm -f $(TARGET) *.o 

Este proyecto compila bien y corre, el único cambio que hice fue agregar el código de prueba en el archivo Main.cpp. mensaje de advertencia/error de muestra:

En el archivo incluído en /usr/include/python2.7/Python.h:8:0,
de Main.cpp: 15:
/usr/include/python2 .7/pyconfig.h: 1158: 0: advertencia: "_POSIX_C_SOURCE" redefinido [habilitado por defecto]
/usr/include/features.h:163:0: nota: esta es la ubicación de la definición anterior
/usr/include/python2.7/pyconfig.h: 1180: 0: advertencia: "_XOPEN_SOURCE" redefinido [habilitado por defecto]
/usr/include/features.h:165:0: nota: esta es la ubicación del definición anterior
g ++ -L/usr/lib/-lpython2.7 -ldl -lutil -o eu EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o main.o
main.o: En función main':
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
Py_Initialize'
/home/BBC/TWS/IBJts/cpp/eu-ats/Main.cpp: 82: referencia no definida a PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:83: undefined reference to
PyRun_SimpleStringFlags '
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:84: referencia indefinida a PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
Py_Exit '
collect2: ld devolvió 1 estado de salida
marca: * [UE] Error 1

alguna ayuda? ¡gracias!

+2

pitón quizá lib es un "normal "Biblioteca C, por lo que es probable que tengas que incluirla usando C' {..} 'externo para asegurar el" enlace "C (de hecho seguramente el .h lo hace él mismo comprobando si se está ejecutando bajo el compilador C o C++ ...) – ShinTakezou

+0

Pruebe nm libpython2.7.so | grep Py_Initialize y ver si este símbolo está en la biblioteca. – selalerer

+0

Agregaste algunas líneas a 'main.cpp' y obtuve varios errores. Intente volver a la versión anterior, verificando que funciona, luego agregue solo la línea '#include" Python.h "' y vea qué sucede. Apuesto a que obtienes los errores "redefinidos" pero no los errores "indefinidos", lo que significa que probablemente olvidaste poner un protector de encabezado en un archivo de encabezado en alguna parte.Una vez que eso funcione, podemos abordar los errores "indefinidos", que probablemente provienen de la falla al vincular un archivo de objeto (como 'Python.o'). – Beta

Respuesta

12

Ven a ver el comentario de Lucas por la respuesta:

"Para deshacerse de la advertencia _POSIX_C_SOURCE, asegúrese de incluir Python.h antes de todos los demás archivos de cabecera."

Tuve el mismo problema. Yo uso Boost Python, así que para mí moví el include de boost/python.hpp a la primera línea en mi archivo .cpp.

(Lukas, enviar su comentario como respuesta por lo que la persona que hizo puede marcarlo como la respuesta correcta, y la cuestión no permanecerá 'sin respuesta' en StackOverflow.)

+0

Tu sugerencia me sirvió. – elgnoh

Cuestiones relacionadas