2013-01-09 57 views
51

Tôi muốn biên dịch mã nguồn C++ 11 trong Mac Terminal nhưng không thành công. Tôi đã thử g++ -std=c++11, g++ -std=c++0x, g++ -std=gnu++11g++ -std=gnu++0x nhưng không có gì hiệu quả. Thiết bị đầu cuối luôn đọc unrecognized command line option. Tuy nhiên, g++ -std=gnu và những thứ như vậy hoạt động tốt (tất nhiên mã nguồn C++ 11 không thể vượt qua).Cách biên dịch C++ với hỗ trợ C++ 11 trong Mac Terminal

Tôi nên sử dụng tùy chọn nào để bật hỗ trợ C++ 11?

Nhân tiện, công cụ dòng lệnh tôi đang sử dụng được cài đặt trong Xcode và tôi chắc chắn rằng chúng được cập nhật.

+1

GCC đi kèm với Xcode là ** không ** cập nhật, trên thực tế nó cổ xưa. Hãy thử 'clang ++'. –

+0

@ H2CO3 Tuyệt vời, hoạt động hoàn hảo. Cảm ơn. Tuy nhiên, 'clang ++' cảnh báo tôi về các tính năng của C++ 11 ... Bất kỳ tùy chọn nào để tắt những cảnh báo đó? – 4ae1e1

+0

Sử dụng tùy chọn '-w' để tắt tất cả cảnh báo. –

Trả lời

79

Vì những người khác đã chỉ ra bạn nên sử dụng clang++ thay vì g++. Ngoài ra, bạn nên sử dụng thư viện libC++ thay vì libstdC++ mặc định; Phiên bản libstdC++ được bao gồm khá cũ và do đó không bao gồm các tính năng thư viện C++ 11.

clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp 

Nếu bạn chưa cài đặt công cụ dòng lệnh cho Xcode, bạn có thể chạy trình biên dịch và các công cụ khác mà không cần thực hiện bằng công cụ xcrun.

xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp 

Ngoài ra nếu có cảnh báo cụ thể bạn muốn tắt, bạn có thể chuyển cờ bổ sung cho trình biên dịch để làm như vậy. Ở cuối các thông báo cảnh báo, nó sẽ hiển thị cho bạn cờ cụ thể nhất có thể kích hoạt cảnh báo. Để tắt cảnh báo đó, bạn thêm no- vào tên cảnh báo.

Ví dụ: có thể bạn không muốn cảnh báo tương thích C++ 98. Vào cuối những cảnh báo đó, nó hiển thị cờ -Wc++98-compat và để tắt chúng, bạn vượt qua -Wno-c++98-compat.

+0

Cảm ơn bạn đã cung cấp thêm thông tin! – 4ae1e1

+3

Chỉ cần kiểm tra những gì bạn đã nói. Thật vậy, một 'std :: array' đơn giản gõ vào' libstdC++' mặc định. – 4ae1e1

+0

Có vấn đề với việc biên dịch 'std :: is_heap()' không có '-stdlib = libC++' – shiraz

20

XCode sử dụng clangclang++ khi biên dịch, chứ không phải g++ (giả sử bạn chưa tùy chỉnh). Thay vào đó, hãy thử:

$ cat t.cpp 
#include <iostream> 

int main() 
{ 
    int* p = nullptr; 
    std::cout << p << std::endl; 
} 
$ clang++ -std=c++11 -stdlib=libc++ t.cpp 
$ ./a.out 
0x0 

Nhờ câu trả lời của bames53 vì đã chỉ ra rằng tôi đã để lại -stdlib=libc++.

Nếu bạn muốn sử dụng một số phần mở rộng GNU (và cũng sử dụng C++ 11), bạn có thể sử dụng -std=gnu++11 thay vì -std=c++11, sẽ bật chế độ C++ 11 và cũng bật tiện ích GNU.

+0

Tuyệt vời. Cảm ơn nhiều. – 4ae1e1

+8

Không chắc chắn những gì -1 là cho ... Nếu đó là bởi vì tôi rời ra '-stdlib = C++' nó đã được tốt đẹp để có một bình luận để tôi có thể sửa chữa nó nhanh hơn! – Cornstalks

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