Biên dịch chương trình C ++ với gcc


84

Câu hỏi: Làm thế nào để biên dịch một chương trình C ++ với trình biên dịch 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 trình biên dịch gcc có khả năng biên dịch các chương trình C ++? Một lưu ý liên quan, sự khác biệt giữa gcc và g ++ là gì. Cảm ơn,


Câu trả lời:


136

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

Kỳ lạ là nếu bạn thay đổi dòng biên dịch thành:

gcc info.C -lstdc++

làm cho nó liên kết với thư viện c ++ chuẩn, sau đó nó sẽ hoạt động 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 ++.


BIÊN TẬP:

Rup nói điều đó tốt nhất trong bình luận của mình cho một câu trả lời khác:

[...] 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 tệp (tức là sẽ biên dịch .c dưới dạng C và .cc dưới dạng 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 tiêu chuẩn theo mặc định ngôn ngữ đầu vào; 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ĩ rằng nó biên dịch tất cả nguồn C thành C ++ thay thế (tức là nó biên dịch cả .c và .cc dưới dạng 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.


41

Nếu bạn cung cấp cho mã một phần mở rộng .c, trình biên dịch sẽ nghĩ rằng đó là mã C, không phải C ++. Và 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ẽ gặp vấn đề với trình liên kết, vì các thư viện C ++ tiêu chuẩn sẽ không được liên kết theo mặc định. Vậy bạn muốn:

g++ myprog.cpp

Và thậm chí đừng cân nhắc sử dụng phần mở rộng .C viết hoa, trừ khi bạn không bao giờ muốn chuyển mã của mình và chuẩn bị bị những người bạn làm việc ghét bỏ.


@Neil: từ những gì tôi có thể nói, gcc coi một .Cphần mở rộng (vốn) là một phần mở rộng c ++. Những điều sau đây hoạt động tốt: gcc test.C -lstdc++ -o testhoặc g++ test.C -o test.
Evan Teran

3
@Evan Có, tất nhiên là có. Điều đó không có nghĩa là bạn nên sử dụng nó, vì nó sẽ gây ra các vấn đề nghiêm trọng về tính di động, cũng như tất cả các tên tệp 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 không gây ra sự cố và được đảm bảo hoạt động trên tất cả các hệ điều hành phổ biến.


12

Theo mặc định, gcc chọn ngôn ngữ dựa trên phần mở rộng tệp, nhưng bạn có thể buộc gcc chọn một phụ trợ ngôn ngữ khác với tùy chọn -x do đó:

gcc -x c++

Các tùy chọn khác được trình bày chi tiết trong trang gcc man trong "Tùy chọn kiểm soát loại đầu ra". Xem ví dụ: http://linux.die.net/man/1/gcc (tìm kiếm văn bản trên trang-x language ).

Phương tiện 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 thông qua stdin.


11

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 nguồn c ++ cho bạn.


16
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 đúng trình biên dịch back-end dựa trên phần mở rộng tệp (tức là sẽ biên dịch .c dưới dạng C và .cc dưới dạng C ++) và liên kết các tệp nhị phân với chỉ các thư viện trợ giúp C và GCC tiêu chuẩn theo mặc định bất kể ngôn ngữ đầu vào; 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ĩ rằng nó biên dịch tất cả nguồn C thành C ++ thay thế (tức là nó biên dịch cả .c và .cc dưới dạng 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

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

1

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

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


1

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

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

Trong cmd cho loại gcc:

gcc --version

trong cmd cho loại g ++:

g ++ - phiên bản

Nếu nó được cài đặt thì hãy tiếp tục.

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

cho .c cú pháp :

gcc -o exe_filename yourfilename.c

Thí dụ:

gcc -o myfile myfile.c

Ở đây exe_filename (ví dụ: myfile) là tên của tệp .exe mà bạn muốn tạo 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 (ví dụ: myfile.c) 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ó ra. Tiếng hoan hô..

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

g ++ -o exe_filename yourfilename.cpp

Sau đó, quá trình tương tự như đối với .c.


2
Câu hỏi là "Làm thế nào để biên dịch một chương trình C ++ với trình biên dịch gcc?" không phải "Làm thế nào để biên dịch một chương trình C với trình biên dịch gcc? hoặc Làm thế nào để biên dịch một chương trình C ++ với trình biên dịch g ++?"
DevX

Bắt đẹp! @DevX
Rajkumar Bansal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.