2011-11-02 94 views
11

Tôi có một dự án được cấu hình qua Autoconf và tôi muốn bắt đầu sử dụng các tính năng C++ 11 trong dự án này. Làm cách nào để chuyển đổi "-std = gnu ++ 0x" luôn được bật và hỗ trợ cho các tính năng được chọn trong khi định cấu hình?Cách sử dụng tính năng C++ 11 với Autoconf?

+2

Trừ khi bạn muốn sử dụng phần mở rộng GCC, công tắc bạn muốn sử dụng là "-std = C++ 0x". –

+0

Điều này đã được giải quyết bằng macro Autoconf tại đây http://stackoverflow.com/questions/8585110/how-can-i-specify-that-i-want-c0x-in-makefile-am. Lợi thế là nó sẽ không thất bại nếu bạn không có hỗ trợ trình biên dịch C++ 11 trong khi AC_CHECK_COMPILE_FLAG sẽ dừng xây dựng khi không thành công. –

+0

Làm thế nào điều này có thể là một bản sao nếu nó đã được hỏi trước? – lvella

Trả lời

13

Bạn có thể làm điều này với một cái gì đó giống như AX_CHECK_COMPILE_FLAG, ví dụ:

AX_CHECK_COMPILE_FLAG([-std=c++0x], [ 
         CXXFLAGS="$CXXFLAGS -std=c++0x"]) 

(Bạn cần phải cẩn thận ở đây là AC_LANG là C++, không phải C tại điểm này được gọi là bởi vì nó có thể sử dụng gcc cho C và một cái gì đó khác cho C++ hoặc ngược lại).

+1

Điều này có lẽ không đủ: nếu trình biên dịch không hỗ trợ -std == C++ 0x thì cấu hình sẽ thành công nhưng quá trình tạo sẽ thất bại. –

+0

+1 mặc dù, vì nó đủ dễ dàng để thêm đối số thứ ba với AC_MSG_ERROR –

+0

@WilliamPursell - điều hữu ích hơn có thể là sử dụng AC_DEFINE cùng với điều này để bản dựng vẫn có thể tiếp tục, chỉ với các triển khai khác nhau của một số phần trong chính xác cùng một cách tôi xử lý thiếu 'snprintf' trong C ngày hôm nay. Đó có thể là ít tính năng tiếp xúc hoặc tiếp xúc thông qua một giao diện thay thế, nhưng nó có thể không phải là một stopper hiển thị tại thời điểm này. – Flexo

1

Để kích hoạt công tắc biên dịch (trừ khi, tất nhiên, người dùng sẽ ghi đè nó), đặt này trong thư mục Makefile.am:

AM_CXXFLAGS=-std=c++0x 

Tôi không nghĩ rằng có một tấm séc có sẵn cho sự hiện diện của C++ 11 tính năng, nhưng bạn sẽ có thể viết một chương trình thử nghiệm khá dễ dàng với các tính năng bạn muốn sử dụng, điều đó sẽ thất bại nếu các tính năng đó không được hỗ trợ. Sau đó, bạn có thể viết một bài kiểm tra như mô tả trong this section of the Autoconf manual.

+1

Nếu thử nghiệm sẽ thất bại mà không có tính năng C++ 11, thì cờ sẽ cần phải ở trong CXXFLAGS hoặc cấu hình sẽ luôn thất bại. –

4

Tôi nghĩ rằng cách đơn giản nhất để làm điều này là để thêm:

 
CXXFLAGS="$CXXFLAGS -std=c++0x" 

trong configure.ac trước AC_PROG_CXX. Nếu trình biên dịch không chấp nhận -std = C++ 0x, thì cấu hình sẽ thất bại với "trình biên dịch C++ không thể tạo các tệp thực thi". Nó không phải là thông báo lỗi tốt nhất, nhưng nó đảm bảo rằng các bản xây dựng sẽ thành công nếu cấu hình thành công. Để có thông báo lỗi tốt hơn, bạn có thể kiểm tra xem trình biên dịch có chấp nhận cờ sau AC_PROG_CXX hay không. Trong cả hai trường hợp, bạn muốn cấu hình thất bại nếu trình biên dịch không cung cấp các tính năng cần thiết nhưng phần mềm của bạn yêu cầu nó.

Lưu ý rằng cài đặt CXXFLAGS trước AC_PROG_CXX có tác dụng phụ không mong muốn khi ngăn cài đặt mặc định cho CXXFLAGS trong trường hợp người dùng không đặt biến đó khi chạy cấu hình. Vì lý do này, thông thường không nên đặt CXXFLAGS trong cấu hình, vì vậy tốt hơn nên kiểm tra cờ sau AC_PROG_CXX (ví dụ: sử dụng giải pháp của awoodland) - chỉ cần đảm bảo bạn thêm AC_MSG_ERROR vào đối số thứ ba của AX_CHECK_COMPILE_FLAG sao cho cấu hình không thành công nếu các tính năng không có sẵn.

17

Bạn đã kiểm tra ax_cxx_compile_stdcxx_11 chưa?

Tôi nghĩ đây chính là điều bạn muốn.

Có một thư viện vĩ mô lớn trên gnu website.

+4

Điều này rất có thể là giải pháp phù hợp. Mọi người chỉ cần nhớ cài đặt gói lưu trữ 'autoconf-archive' trong Debian, và chạy' aclocal' trước khi chạy 'autoconf' (để kéo các macro cần thiết vào' aclocal.m4'). – carandraug

+0

Đây là giải pháp tốt hơn so với tôi, vốn không tồn tại khi tôi trả lời câu hỏi này. – Flexo

+0

@carandraug Tôi rất cảm kích nếu bạn hoặc OP có thể giải thích thêm chi tiết. Cài đặt và cú pháp chính xác để sử dụng là gì? Trước khi cài đặt autoconf-archive, tôi sẽ luôn gặp lỗi cú pháp (không phải lỗi "không tìm thấy") tại cuộc gọi trong configure.ac. Sau khi cài đặt autoconf-archive, tôi nhận được "lỗi cú pháp: gần mã thông báo bất ngờ' ac_config_headers = "$ ac_config_headers config.h" ' – garyp

Các vấn đề liên quan