2012-12-08 45 views
5

Tôi đã biên dịch tĩnh Python2.7 mà không có bất kỳ lỗi nào. Để kiểm tra xây dựng của tôi, tôi sử dụng đoạn mã sau:Python - Py_Initialize chưa được giải quyết trong khi biên dịch

#include "Python.h" 
int main() 
{ 
    Py_Initialize(); 
} 

Và tôi đang biên soạn nó như thế này:

$ gcc -static -I/path/to/python/header -L/path/to/my/staticpythonlib \ 
-lpython2.7 -ldl -l_all_other_needed_lib /tmp/my_previous_snippet.c -o myouput 

Tuy nhiên, một lỗi xảy ra. gcc tuyên bố số undefined reference nổi tiếng.

test.c :(văn bản + 0x1):. Tham khảo Không xác định để 'Py_Initialize'

Tò mò tôi đã sử dụng gcc với cờ cách rườm rà (Tôi sẽ không dán kết quả ở đây) và trình biên dịch nói rằng, nó sử dụng libpython của tôi, nhưng không thể tìm thấy tài liệu tham khảo. Vì vậy, tôi liệt kê những biểu tượng của thư viện python2.7 tĩnh của tôi:

$ nm /path/to/pythonlib |grep Py_Initialize 
frozenmain.o   U Py_Initialize 
pythonrun.o 0000009e9 T Py_Initialize 
pythonrun.o 000000052 T Py_Initialize_Ex 
main.o     U Py_Initialize 

Chúng ta có thể thấy, đó Py_Initialize được tham chiếu một cách chính xác trong pythonrun.o. Tuy nhiên tôi không biết làm thế nào trình biên dịch đã chọn đúng đối tượng tập tin.

Câu hỏi của tôi là:

  1. Làm thế nào tôi có thể chắc chắn, gcc có sử dụng các tập tin đối tượng đúng trong lib .a tôi?
  2. Có điều gì sai về các tùy chọn biên dịch của tôi không?

Cảm ơn sự giúp đỡ của bạn.

+0

Đây là một lỗi xảy ra trong mối liên hệ không trong biên dịch. – alk

Trả lời

6

Đơn đặt hàng quan trọng! Cụ thể hơn, thứ tự trong các đối số cho các vấn đề gcc. Cụ thể hơn, nếu đối tượng bar sử dụng hàm bluh từ thư viện bleh thì đơn đặt hàng -lbleh bar.o là vấn đề vì không cung cấp lý do gì để gcc tìm hàm bluh trong bleh. Mặt khác, khi bạn sử dụng bar.o -lbleh thì gcc biết bạn đang đề cập đến bluh và khi nào nó được xử lý -lbleh, nó sẽ cố gắng giải quyết sự phụ thuộc. Điều này được đề cập nhanh chóng tại http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html. Theo quy tắc, luôn chỉ định thư viện sau đối tượng của bạn.

Để tái tạo vấn đề của bạn, tạo ra một tập tin a1.c như trong:

#include "Python.h" 

int main() 
{ 
    Py_Initialize(); 
    return 0; 
} 

Bây giờ biên dịch với gcc -static -I/usr/include/python2.7 -L/usr/lib/python2.7/config/ -lpython2.7 -ldl -lm -lutil -lz -pthread -o a1 a1.c. Điều này cho phép tham chiếu không xác định đến Py_Initialize. Tất nhiên bạn phải thay đổi đường dẫn để phù hợp với cài đặt của bạn.

Bây giờ, thay vào đó, biên dịch với gcc -static -I/usr/include/python2.7 -L/usr/lib/python2.7/config/ -o a1 a1.c -lpython2.7 -ldl -lm -lutil -lz -pthread và nó hoạt động (bỏ qua nhiều cảnh báo có thể có, đó là một vấn đề khác).

1

Tôi đang sử dụng python 2.7 và đặt đường dẫn của thư mục cài đặt python trong biến môi trường. Tôi cũng sử dụng tăng 1.5.0

làm theo các bước để biên dịch mã dưới đây

#include <python2.7/Python.h> 
int main() 
{ 
Py_Initialize(); 

PyRun_SimpleString("print \"Hello, world!\""); 

Py_Finalize(); 
return 0; 
} 

Chạy lệnh: -

g++ hello.cc -lpython2.7 
./a.out 
Các vấn đề liên quan