2010-07-05 43 views
40

Câu hỏi: Cách biên dịch chương trình C++ bằng trình biên dịch gcc?Soạn thảo chương trình C++ với gcc

info.c:

#include<iostream> 
using std::cout; 
using std::endl; 
int main() 
{ 
    #ifdef __cplusplus 
    cout << "C++ compiler in use and version is " << __cplusplus << endl; 
    #endif 
    cout <<"Version is " << __STDC_VERSION__ << endl; 
    cout << "Hi" << __FILE__ << __LINE__ << endl; 
} 

và khi tôi cố gắng biên dịch info.c

$ gcc info.C

Undefined      first referenced 
symbol        in file 
cout        /var/tmp/ccPxLN2a.o 
endl(ostream &)      /var/tmp/ccPxLN2a.o 
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o 
ostream::operator<<(int)   /var/tmp/ccPxLN2a.o 
ostream::operator<<(long)   /var/tmp/ccPxLN2a.o 
ostream::operator<<(char const *) /var/tmp/ccPxLN2a.o 
ld: fatal: Symbol referencing errors. No output written to a.out 
collect2: ld returned 1 exit status 

Không phải là trình biên dịch gcc có khả năng biên dịch chương trình C++? Trên một lưu ý liên quan, sự khác biệt giữa gcc và g ++ là gì. Cảm ơn,

+0

Bản sao có thể có của [Sự khác nhau giữa g ++ và gcc?] (Https://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc) –

Trả lời

77

gcc thực sự có thể biên dịch mã C++ tốt. Các lỗi bạn nhận được là liên kết lỗi, không phải lỗi trình biên dịch.

Odds được rằng nếu bạn thay đổi dòng biên soạn được điều này:

gcc info.C -lstdc++ 

mà làm cho nó liên kết đến các tiêu chuẩn C++ thư viện, sau đó nó sẽ chỉ làm việc tốt.

Tuy nhiên, bạn chỉ nên làm cho cuộc sống của mình dễ dàng hơn và sử dụng g ++.


EDIT:

Rup nói nó tốt nhất trong his comment để câu trả lời khác:

[...] gcc sẽ chọn đúng back-end biên dịch dựa trên tập tin phần mở rộng (tức là biên dịch ac thành C và a.cc as C++) và liên kết các tệp nhị phân với chỉ thư viện trợ giúp C và GCC chuẩn theo mặc định bất kể ngôn ngữ nhập liệu; g ++ cũng sẽ chọn đúng back-end dựa trên phần mở rộng ngoại trừ mà tôi nghĩ rằng nó biên dịch tất cả các nguồn C như C++ để thay thế (tức là nó biên dịch cả .c và .cc như C++) và nó bao gồm libstdC++ trong liên kết của nó bước bất kể ngôn ngữ nhập liệu.

15

sử dụng g++ thay vì gcc.

1

Nếu tôi nhớ chính xác, gcc xác định loại tệp từ hậu tố. Vì vậy, làm cho nó foo.cc và nó sẽ làm việc.

Và, để trả lời câu hỏi khác của bạn, rằng là sự khác biệt giữa "gcc" và "g ++". gcc là giao diện người dùng chọn trình biên dịch chính xác.

29

Nếu bạn cung cấp mã mở rộng .c thì trình biên dịch cho rằng đó là mã C chứ không phải C++. Trình điều khiển trình biên dịch C++ được gọi là g ++, nếu bạn sử dụng trình điều khiển gcc, bạn sẽ có các vấn đề liên kết, vì các thư viện C++ chuẩn sẽ không được liên kết theo mặc định. Vì vậy, bạn muốn:

g++ myprog.cpp 

Và thậm chí không xem xét sử dụng chữ hoa .C mở rộng, trừ khi bạn không bao giờ muốn chuyển mã và sẵn sàng bị ghét bởi những người bạn làm việc.

+0

@Neil: từ những gì tôi có thể nói, gcc không xem xét phần mở rộng '.C' (capital) là phần mở rộng C++. Các công trình sau đây tốt: 'gcc test.C -lstdC++ -o test' hoặc' g ++ test.C -o test'. –

+2

@Evan Có, tất nhiên là có. Điều đó không có nghĩa là bạn nên sử dụng nó mặc dù, vì nó sẽ gây ra các vấn đề về tính di động khủng khiếp, giống như tất cả các tên tệp có phân biệt chữ hoa chữ thường. Phần mở rộng cho các tệp C++ phải luôn là .cpp. Điều này gây ra không có vấn đề, và được đảm bảo để làm việc trên tất cả các hệ điều hành phổ biến. –

4

Sự khác biệt giữa gcc và g ++ là:

 gcc   |  g++ 
compiles c source | compiles c++ source 

sử dụng g ++ thay vì gcc để biên dịch C++ bạn nguồn.

+11

Nó phức tạp hơn một chút, như trong các câu trả lời khác ở đây. gcc sẽ chọn trình biên dịch back-end chính xác dựa trên phần mở rộng của tệp (tức là sẽ biên dịch ac thành C và acc dưới dạng C++) và liên kết nhị phân với các thư viện trợ giúp C và GCC chuẩn theo mặc định bất kể ngôn ngữ nhập; g ++ cũng sẽ chọn back-end chính xác dựa trên phần mở rộng ngoại trừ việc tôi nghĩ nó biên dịch tất cả các nguồn C thành C++ (tức là nó biên dịch cả .c và .cc thành C++) và nó bao gồm libstdC++ trong bước liên kết của nó bất kể ngôn ngữ đầu vào. – Rup

+0

@Rup: đúng, đây là cơ bản những gì tôi đã nói trong câu trả lời của tôi. –

2

Bạn có thể buộc sử dụng gcc để chọn một backend ngôn ngữ khác nhau với các tùy chọn -x như sau:

gcc -x c++ 

Các tuỳ chọn khác được chi tiết hóa trong man page của gcc dưới. Xem ví dụ http://linux.die.net/man/1/gcc

Cơ sở này rất hữu ích trong trường hợp gcc không thể đoán ngôn ngữ bằng cách sử dụng phần mở rộng tệp, ví dụ nếu bạn đang tạo mã và cấp nó cho gcc qua stdin.

2

Nó hoạt động tốt cho tôi. Chỉ một dòng mã trong cmd.

Trước tiên, hãy xác nhận rằng bạn đã cài đặt trình biên dịch gcc (cho c) hoặc g ++ (cho C++).

Trong cmd cho loại gcc:

gcc --version

trong cmd cho g ++ loại:

g ++ --version

Nếu nó được cài đặt sau đó tiến hành .

Bây giờ, biên dịch c hoặc cpp của bạn sử dụng cmd

cho .c cú pháp:

gcc -o exe_filename yourfilename.c

Ví dụ:

gcc-do myfile myfile.c

Ở đây exe_filename (myfile chẳng hạn) là tên của tệp .exe mà bạn muốn sản xuất sau khi biên dịch (Lưu ý: tôi chưa đặt bất kỳ phần mở rộng nào ở đây). Và yourfilename.c (myfile.c chẳng hạn)tệp nguồn của bạn có phần mở rộng .c.

Bây giờ hãy chuyển đến thư mục chứa tệp .c của bạn, tại đây bạn sẽ tìm thấy tệp có phần mở rộng .exe. Chỉ cần mở nó. Hoan hô ..

Đối với .cpp cú pháp:

g ++ -o exe_filename yourfilename.cpp

Sau khi quá trình này là tương tự như đối .c.

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