Tôi biên dịch một mã thử nghiệm với g ++ mà không gặp bất kỳ vấn đề nào.g ++ với python.h, cách biên dịch
#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
hoạt động tốt và chạy.
Nhưng khi tôi cố gắng nhúng mã này vào một dự án khác, nó không thành công. Nó thực sự làm tôi bối rối.
Makefile giống như sau.
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
Dự án này biên soạn và chạy, thay đổi duy nhất tôi thực hiện là thêm mã thử nghiệm vào tệp Main.cpp. thông điệp cảnh báo/báo lỗi cho thấy:
Trong tập tin bao gồm từ /usr/include/python2.7/Python.h:8:0,
từ main.cpp: 15:
/usr/include/python2 .7/pyconfig.h: 1158: 0: cảnh báo: "_POSIX_C_SOURCE" được xác định lại [được bật theo mặc định]
/usr/include/features.h:163:0: lưu ý: đây là vị trí của định nghĩa trước
/usr/include/python2.7/pyconfig.h: 1180: 0: cảnh báo: "_XOPEN_SOURCE" được định nghĩa lại [được bật theo mặc định]
/usr/include/features.h:165:0: lưu ý: đây là vị trí của định nghĩa trước
g ++ -L/usr/lib/-lpython2.7 -ldl -lutil -o eu EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o main.o
main.o: Trong chức năngmain':
Py_Initialize'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:81: undefined reference to
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp: 82: không xác định tham chiếu đếnPyRun_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: undefined tham chiếu đếnPyRun_SimpleStringFlags'
Py_Exit '
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
collect2: ld trở về 1 exit status
thực hiện: * [eu] Lỗi 1
trợ giúp nào? cảm ơn bạn!
python lẽ lib là một "bình thường "C thư viện, vì vậy bạn có thể phải bao gồm nó bằng cách sử dụng' bên ngoài "C" {..} 'để đảm bảo C" liên kết "(thực sự chắc chắn. H hiện nó tự kiểm tra nếu nó đang chạy theo trình biên dịch C hoặc C + + ...) – ShinTakezou
Thử nm libpython2.7.so | grep Py_Initialize và xem biểu tượng này có nằm trong thư viện hay không. – selalerer
Bạn đã thêm một vài dòng vào 'main.cpp' và gặp một số lỗi. Hãy thử quay lại phiên bản cũ, xác minh rằng nó hoạt động, sau đó chỉ thêm dòng '#include" Python.h "' và xem điều gì xảy ra. Tôi sẽ đặt cược bạn nhận được các lỗi "redefined" nhưng không phải là "undefined" lỗi, có nghĩa là bạn có thể chỉ cần quên đặt một guard header trong một file header ở đâu đó.Khi đã làm việc, chúng ta có thể giải quyết các lỗi "không xác định", có thể đến từ việc không liên kết một tệp đối tượng (như 'Python.o'). – Beta