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
: ld 1 çıkış durumu/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: fonksiyonmain':
olarak Py_Initialize'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
/ev/BBC/TWS/IBJts/cpp/eu-ats/Main.cpp: 82: tanımsız başvuruPyRun_SimpleStringFlags'
PyRun_SimpleStringFlags '
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:83: undefined reference to
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:84: tanımsız başvuruPyRun_SimpleStringFlags'
Py_Exit '
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
collect2: * [eu] Hata 1
yapmak döndü
herhangi bir yardım? teşekkür ederim!
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
Deneyi deneyin libpython2.7.so | grep Py_Initialize ve bu sembolün kütüphanede olup olmadığını görün. – selalerer
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