2012-04-07 16 views
6

Kompiluję jeden kod testowy z g ++ bez żadnego problemu.g ++ z python.h, jak skompilować

#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 działa dobrze i działa.

Ale kiedy próbuję umieścić ten kod w innym projekcie, nie działa. Naprawdę mnie to zakręca.

Plik Makefile jest następujący.

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 

Ten projekt kompiluje i działa, jedyną zmianą było dodanie zrobiłem testowy kod w pliku main.cpp. ostrzeżenie/błąd pokazuje:

W pliku zawarte z /usr/include/python2.7/Python.h:8:0,
z main.cpp: 15:
/usr/include/python2 .7/pyconfig.h: 1158: 0: ostrzeżenie: "_POSIX_C_SOURCE" przedefiniowane [domyślnie włączone]
/usr/include/features.h:163:0: uwaga: jest to lokalizacja poprzedniej definicji
/usr/include/python2.7/pyconfig.h: 1180: 0: ostrzeżenie: "_XOPEN_SOURCE" przedefiniowano [domyślnie włączone]
/usr/include/features.h:165:0: uwaga: jest to lokalizacja poprzednia definicja
g ++ -l/usr/lib/-lpython2.7 -ldl -lutil -o UE EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o main.o
main.o W zależności 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: niezdefiniowane odniesienia do
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:84 PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:83: undefined reference to
PyRun_SimpleStringFlags' nieokreślonej odniesieniu do PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
Py_Exit "
collect2: ld zwróconym 1 wyjścia stan
Marka: * [UE] Error 1

jakiejkolwiek pomocy? Dziękuję Ci!

+2

może lib pyton jest „normalny "Biblioteka C, więc najprawdopodobniej będziesz musiał ją uwzględnić za pomocą' zewnętrznego "C" {..} 'aby zapewnić C" powiązanie "(rzeczywiście na pewno .h samo sprawdza czy działa pod kompilatorem C lub C++ ...) – ShinTakezou

+0

Wypróbuj nm libpython2.7.so | grep Py_Initialize i zobacz, czy ten symbol znajduje się w bibliotece. – selalerer

+0

Dodałeś kilka linii do 'main.cpp' i otrzymałeś kilka błędów. Spróbuj przywrócić starą wersję, sprawdzając, czy działa, a następnie dodając wiersz "#include" Python.h "i zobacz, co się stanie. Założę się, że dostajesz "przedefiniowane" błędy, ale nie "nieokreślone", co oznacza, że ​​prawdopodobnie zapomniałeś umieścić w nagłówku strażnika nagłówka.Kiedy to zadziała, możemy poradzić sobie z "nieokreślonymi" błędami, które prawdopodobnie wynikają z nieudanego połączenia pliku obiektowego (np. 'Python.o'). – Beta

Odpowiedz

12

Spójrz na komentarz Lucasa za odpowiedź:

„Aby pozbyć się ostrzeżenia _POSIX_C_SOURCE, upewnij się, że obejmują Python.h przed wszystkimi innymi plikami cel.”

Miałem ten sam problem. Używam Boost Python, więc dla mnie przeniosłem zawartość boost/python.hpp do pierwszej linii w moim pliku .cpp.

(Lukas, dodać komentarz jako odpowiedź więc osoba, która zapytała można oznaczyć go jako właściwą odpowiedź, a pytanie nie pozostanie „bez odpowiedzi” w StackOverflow.)

+0

Twoja sugestia załatwiła sprawę. – elgnoh