2012-04-07 1 views
6

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ăng 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: không xác định tham chiếu đến 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: undefined tham chiếu đến PyRun_SimpleStringFlags'
/home/bbc/TWS/IBJts/cpp/eu-ats/Main.cpp:85: undefined reference to
Py_Exit '
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!

+2

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

+0

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

+0

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

Trả lời

12

Hãy nhìn vào bình luận Lucas cho câu trả lời:

"Để thoát khỏi cảnh báo _POSIX_C_SOURCE, hãy chắc chắn để bao gồm Python.h trước khi tất cả các tập tin tiêu đề khác."

Tôi gặp vấn đề tương tự. Tôi sử dụng Boost Python, vì vậy đối với tôi, tôi đã chuyển bao gồm boost/python.hpp vào dòng đầu tiên trong tệp .cpp của tôi.

(Lukas, gửi bình luận của bạn như là một câu trả lời để người hỏi có thể đánh dấu nó như là câu trả lời đúng, và câu hỏi sẽ không còn 'chưa được trả lời' trong StackOverflow.)

+0

Đề xuất của bạn đã thực hiện thủ thuật cho tôi. – elgnoh