2012-04-07 18 views
6

Herhangi bir sorun olmadan g ++ ile bir test kodu derlerim.g ++ python.h ile nasıl derlenir

#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 ince ve çalışır çalışır.

Ancak bu kodu başka bir projeye gömmeye çalıştığımda, başarısız oluyor. Bu beni gerçekten karıştırıyor.

Makefile aşağıdaki gibidir.

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 

Bu proje yaptığım tek değişiklik main.cpp dosyasında test kodu ekleyerek oldu, iyi derler ve çalışır. Uyarı/hata mesajı gösterilir: 15:
/usr/include/python2 dosyasında

/usr/include/python2.7/Python.h:8:0,
main.cpp gelen den dahil .7/pyconfig.h: 1158: 0: uyarı: "_POSIX_C_SOURCE" yeniden tanımlandı [varsayılan olarak etkindir]
/usr/include/features.h:163:0: not: bu, önceki tanımın
/usr/include/python2.7/pyconfig.h: 1180: 0: uyarı: "_XOPEN_SOURCE" yeniden tanımlandı [varsayılan olarak etkindir]
/usr/include/features.h:165:0: not: bu, konumun önceki tanım
g ++ -L/usr/lib/-lpython2.7 -ldl -lutil -o ab EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o main.o
main.o: fonksiyon main':
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
olarak Py_Initialize'
/ev/BBC/TWS/IBJts/cpp/eu-ats/Main.cpp: 82: tanımsız başvuru 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: tanımsız başvuru PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
Py_Exit '
collect2: * [eu] Hata 1

: ld 1 çıkış durumu
yapmak döndü

herhangi bir yardım? teşekkür ederim!

+2

belki lib piton bir "normaldir "C kütüphanesi, bu yüzden" harici "C" {..} "kullanarak C" bağlantısını "sağlamak zorundasınız demektir. (Gerçekten de .h, C veya C++ derleyicisinin altında çalışıyorsa, gerçekten de kendini kontrol ediyor ...) – ShinTakezou

+0

Deneyi deneyin libpython2.7.so | grep Py_Initialize ve bu sembolün kütüphanede olup olmadığını görün. – selalerer

+0

main main.cpp' öğesine birkaç satır eklediniz ve birkaç hata yaptınız. Eski sürüme geri dönmeyi deneyin, çalışıp çalışmadığını doğrulayın, sonra sadece #include "Python.h" satırını ekleyin ve ne olduğunu görün. Bahse girerim "yeniden tanımlanmış" hataları değil, "tanımsız" hataları almazsınız, bu da muhtemelen bir başlık dosyasında bir başlık koruyucusunu bir yere koymayı unuttuğunuz anlamına gelir.Bu bir kez işe yaramazsa, büyük olasılıkla bir nesne dosyasını ("Python.o" gibi) bağlayamamadan gelen "tanımlanmamış" hataları çözebiliriz. – Beta

cevap

12

cevap Lucas'ın comment bir göz atın:

"_POSIX_C_SOURCE'a uyarı kurtulmak için, tüm diğer başlık dosyaları önce Python.h içerdiğinden emin olun."

Aynı problem vardı. Boost Python kullanıyorum, bu yüzden benim için .ppp dosyasındaki ilk satıra boost/python.hpp öğesini ekledim.

(sorulan kişi doğru cevabı olarak işaretleyebilirsiniz böylece Lukas, bir cevap olarak Yorum yazmak ve soru StackOverflow içinde 'yanıtsız' kalmayacaktır.)

+0

Öneriniz benim için hile yaptı. – elgnoh