tôi có thể trả lời một phần của câu hỏi, tại sao bạn nhận được thông báo .
Thứ gì đó trong quá trình xây dựng của bạn đang gọi gcc trên tệp nguồn C++ với tùy chọn -Wstrict-prototypes
. Đối với C và Objective-C, điều này làm cho trình biên dịch cảnh báo về các khai báo hàm kiểu cũ không khai báo các kiểu đối số.
Đối với C++, tùy chọn này không có ý nghĩa; những tuyên bố đó thậm chí không được ngôn ngữ cho phép (nguyên mẫu là bắt buộc).
(Tôi không biết tại sao thông báo đề cập đến Ada; -Wstrict-prototypes
thậm chí còn ít ý nghĩa hơn đối với Ada so với C++. Đây không phải là một vấn đề lớn, nhưng tôi đã gửi this bug report, được đánh dấu là GIẢI THÍCH/CỐ ĐỊNH từ 2015-12 -06.)
Giải pháp nên loại bỏ tùy chọn -Wstrict-prototypes
khỏi yêu cầu gcc. Nhưng vì bạn không gọi trực tiếp gcc, thật khó để biết cách thực hiện điều đó.
tôi đã có thể tái tạo các cảnh báo bằng setup.py
bạn, sau khi tự tạo ra một tập tin dummy example_wrap.cxx
:
% python setup.py build_ext -i
running build_ext
building '_foolib' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c example_wrap.cxx -o build/temp.linux-i686-2.7/example_wrap.o
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
...
Vì vậy, nó có thể là một lỗi nhỏ trong Python của build_ext
.
Nhưng vì đó chỉ là cảnh báo chứ không phải lỗi nghiêm trọng, tôi cho rằng bạn có thể bỏ qua nó một cách an toàn. gcc cảnh báo về tùy chọn vô nghĩa, nhưng sau đó nó chỉ bỏ qua nó.
EDIT:
Nhìn qua các nguồn Python-2.7.2, phần này của configure.in
có thể là thủ phạm:
case $GCC in
yes)
if test "$CC" != 'g++' ; then
STRICT_PROTO="-Wstrict-prototypes"
fi
(Tôi giả định đó là viện dẫn khi sử dụng build_ext
.)
Chỉ bật tùy chọn -Wstrict-prototypes
nếu trình biên dịch là không phải được gọi là g++
- nhưng trong trường hợp của bạn, nó sử dụng lệnh gcc
để biên dịch mã nguồn C++. Và trong Lib/distutils/command/build_ext.py
, build_extension()
không chú ý đến ngôn ngữ tệp nguồn khi gọi self.compiler.compile()
, chỉ khi gọi self.compiler.link_shared_object()
. (Có vẻ như kỳ quặc, đối với các trình biên dịch khác với gcc, bạn sẽ không nhất thiết có thể sử dụng lệnh tương tự để biên dịch C và C++ - và dù sao đi nữa, bạn cũng nên sử dụng lệnh g++
.)
CẬP NHẬT: Báo cáo lỗi Python đã được gửi: https://bugs.python.org/issue9031 và bị đóng dưới dạng bản sao của số này: https://bugs.python.org/issue1222585, vẫn mở khi tôi viết điều này.
Nhưng như tôi đã nói, đó chỉ là cảnh báo và bạn có thể bỏ qua nó một cách an toàn. Có lẽ các nhà bảo trì Python có thể sử dụng thông tin trên để khắc phục sự cố trong bản phát hành trong tương lai.
Bây giờ đó là một số trò chơi tuyệt vời! Cảm ơn bạn đã gặp rắc rối khi ngửi nó. Tôi sẽ gửi nó cho các nhà bảo trì Python. –
@HomunculusReticulli: Tuyệt, vui lòng theo dõi ở đây với bất kỳ phản hồi nào bạn nhận được. –
@HomunculusReticulli: FYI, tôi đã báo cáo lỗi chống lại gcc vì thực tế là tùy chọn được chấp nhận cho Ada (điều này không liên quan trực tiếp đến câu hỏi hiện tại). http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51115 –