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


875

Sự khác biệt giữa g ++ và gcc là gì? Cái nào trong số chúng nên được sử dụng để phát triển c ++ chung?


g ++ => trình biên dịch c ++ gcc => trình biên dịch c
Nagappa

Câu trả lời:


727

gccg++là trình điều khiển trình biên dịch của Bộ sưu tập Trình biên dịch GNU (trước đây chỉ là Trình biên dịch GNU C ).

Mặc dù họ tự động xác định các phụ trợ ( cc1 cc1plus...) để gọi tùy thuộc vào loại tệp, trừ khi bị ghi đè -x language, chúng có một số khác biệt.

Sự khác biệt quan trọng nhất có thể có trong mặc định của chúng là các thư viện mà chúng liên kết tự động.

Theo các tùy chọn liên kết tài liệu trực tuyến của GCC và cách gọi g ++ , g++tương đương với gcc -xc++ -lstdc++ -shared-libgcc(tùy chọn thứ nhất là trình biên dịch, hai tùy chọn thứ hai là các tùy chọn liên kết). Điều này có thể được kiểm tra bằng cách chạy cả hai với -vtùy chọn (nó hiển thị các lệnh công cụ phụ trợ đang chạy).


13
Từ câu trả lời này, tôi kết luận rằng lệnh g ++ hiệu quả chỉ là gcc với một loạt các cờ .. Tại sao sau đó, có hai nhị phân khác nhau (có cùng kích thước) cho gcc và g ++ trong linux?. Chúng ta không nên có một nhị phân và một liên kết tượng trưng (hoặc một cái gì đó dọc theo các dòng đó)?
UchihaItachi

9
@Uchihaltachi các tệp này là các liên kết cứng và khi chúng được khởi động, chúng kiểm tra argv[0]xem nên sử dụng lời mời nào. Điều này là khá phổ biến trong số các tiện ích UNIX cốt lõi.
Thưởng thức

438

GCC: Bộ sưu tập trình biên dịch GNU

  • Giới thiệu đến tất cả các ngôn ngữ khác nhau được trình biên dịch GNU hỗ trợ.

gcc: Trình biên dịch GNU C
g++ GNU C: GNU C ++

Sự khác biệt chính:

  1. gcc sẽ biên dịch: *.c\*.cpp các tệp tương ứng là C và C ++.
  2. g++ sẽ biên dịch: *.c\*.cpp các tệp nhưng tất cả chúng sẽ được coi là tệp C ++.
  3. Ngoài ra nếu bạn sử dụng g++ để liên kết các tệp đối tượng, nó sẽ tự động liên kết trong các thư viện std C ++ ( gcckhông làm điều này).
  4. gcc biên dịch tập tin C có ít macro được xác định trước.
  5. gccbiên dịch *.cppg++biên dịch *.c\*.cpptập tin có thêm một vài macro.

Macro bổ sung khi biên dịch *.cpptệp:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern

37
Bạn có thể liên kết thư viện std C ++ gccbằng cách truyền -lstdc++tham số.
Denilson Sá Maia

16
Có nhiều sự khác biệt giữa 'gcc' và 'g ++' so với chỉ các thư viện tiêu chuẩn, do đó gcc -lstdc++vẫn sẽ không giúp bạn có hành vi tương tự như g++. Chúng tôi đặt tất cả các hành vi cụ thể về ngôn ngữ đó vào trình điều khiển riêng của nó vì một lý do, đó là những gì nó dành cho. :-)
Ti Strga

8
Nhận xét của tôi không nói về việc chỉ liên kết ... đó là điểm chính. Ngay cả khi chỉ giới hạn thảo luận về liên kết (mà câu trả lời của bạn không có), người dùng vẫn không thể sử dụng toàn bộ thư viện chuẩn C ++ bằng cách chỉ định -lstdc++, vì sẽ thiếu phụ thuộc vào toán học, RTTI và thông tin ngoại lệ. Việc một trường hợp kiểm thử nhất định có liên kết hay không sẽ phụ thuộc vào hệ điều hành và các tính năng C ++ nào được sử dụng bởi trường hợp kiểm thử, đó là lý do tại sao tất cả kiến ​​thức đó được tích hợp vào trình điều khiển g ++ thay vì để người dùng tìm ra .
Ti Strga

10
Tin tôi đi, chúng ta có cuộc thảo luận này rất nhiều, thường là khi người dùng Linux cố gắng chuyển Makefile chưa hoàn chỉnh của mình sang nền tảng khác. :-) Giai đoạn liên kết g ++ làm được nhiều hơn so với gcc -lstdc++các hệ điều hành khác, đặc biệt khi mục tiêu là một nền tảng nhúng. May mắn thay, đó là lý do tại sao chúng tôi gửi g ++ ngay từ đầu.
Ti Strga

10
Các chuỗi spec được xây dựng để dành riêng cho trình biên dịch, lần lượt là dành riêng cho hệ điều hành và đích. Vì vậy, nếu bạn chạy -dumpspectrên (ví dụ) một trình biên dịch chéo nhắm vào một hệ thống nhúng, bạn sẽ thấy sự khác biệt. Có nhiều hơn sự khác biệt của trình liên kết ... một lần nữa, đó là câu trả lời của bạn về (macro tiền xử lý, bao gồm các đường dẫn, nhiều thư viện thời gian chạy). Chúng tôi dường như đang nói chuyện với nhau, nhưng là một người duy trì GCC trước đây, tôi đảm bảo với bạn rằng tôi quen thuộc với những gì các mặt trận là và không.
Ti Strga

82

Đối với c ++ bạn nên sử dụng g ++.

Đó là cùng một trình biên dịch (ví dụ: bộ sưu tập trình biên dịch GNU). GCC hoặc G ++ chỉ cần chọn một giao diện người dùng khác với các tùy chọn mặc định khác nhau.

Tóm lại: nếu bạn sử dụng g ++, frontend sẽ thông báo cho trình liên kết rằng bạn có thể muốn liên kết với các thư viện chuẩn C ++. Giao diện gcc sẽ không làm điều đó (cũng có thể liên kết với họ nếu bạn vượt qua các tùy chọn dòng lệnh bên phải).


3
+1 Ngoài ra trang man gcc GNU / Linux của tôi nói: "Khi bạn biên dịch các chương trình C ++, bạn nên gọi GCC là g ++ thay thế."
Chế độ xem hình elip

35

Sự khác biệt giữa g++và là gccgì?

gccđã phát triển từ một ngôn ngữ duy nhất "Trình biên dịch GNU C" thành một "Bộ sưu tập trình biên dịch GNU" đa ngôn ngữ. Thuật ngữ "Trình biên dịch GNU C" đôi khi vẫn được sử dụng trong ngữ cảnh lập trình C.

Các g++ C ++ biên dịch cho GNU Compiler Collection. Giống như gnattrình biên dịch Ada cho gcc. xem Sử dụng Bộ sưu tập Trình biên dịch GNU (GCC)

Ví dụ: lệnh Ubuntu 16.04 và 18.04 man g++trả về GCC(1)trang thủ công.

Ubuntu 16.04 và 18.04 man gccnói rằng ...

g++ chấp nhận hầu hết các tùy chọn tương tự như gcc

và đó là mặc định ...

... sử dụng gcckhông thêm thư viện C ++. g++là một chương trình gọi GCC và tự động chỉ định liên kết với thư viện C ++. Nó coi các tệp .c, .h và .i là các tệp nguồn C ++ thay vì các tệp nguồn C trừ khi sử dụng -x. Chương trình này cũng hữu ích khi biên dịch trước tệp tiêu đề C có phần mở rộng .h để sử dụng trong các phần tổng hợp C ++.

Tìm kiếm các gcctrang man để biết thêm chi tiết về phương sai tùy chọn giữa gccg++.

Cái nào nên được sử dụng để phát triển c ++ chung?

Về mặt kỹ thuật, gcchoặc g++có thể được sử dụng để phát triển C ++ chung với các cài đặt tùy chọn áp dụng. Tuy nhiên, g++hành vi mặc định được liên kết tự nhiên với sự phát triển C ++.

Các trang người đàn ông Ubuntu 18,04 thêm đoạn sau:

Cách thông thường để chạy GCC là chạy tệp thực thi được gọi gcchoặc machine-gcckhi biên dịch chéo hoặc machine-gcc-versionchạy phiên bản cụ thể của GCC. Khi bạn biên dịch các chương trình C ++, bạn nên gọi GCC g++thay thế.


21

Một sự khác biệt đáng chú ý là nếu bạn truyền một .ctệp cho gcc, nó sẽ biên dịch thành C.

Hành vi mặc định của g ++ là coi .ccác tệp là C ++ (trừ khi -x cđược chỉ định).


19
(Muộn, nhưng đối với hậu thế,) Như các câu trả lời khác đã chỉ ra, đây không phải là "sự khác biệt đáng chú ý duy nhất", trừ khi người đọc có một định nghĩa sai lệch về sự đáng chú ý.
gạch dưới

16

Mặc dù các lệnh gcc và g ++ làm những việc rất giống nhau, g ++ được thiết kế để trở thành lệnh bạn gọi để biên dịch chương trình C ++; Nó dự định tự động làm điều đúng đắn.

Đằng sau hậu trường, họ thực sự là cùng một chương trình. Theo tôi hiểu, cả hai quyết định nên biên dịch chương trình thành C hay C ++ dựa trên phần mở rộng tên tệp. Cả hai đều có khả năng liên kết với thư viện chuẩn C ++, nhưng chỉ có g ++ làm điều này theo mặc định. Vì vậy, nếu bạn có một chương trình được viết bằng C ++ mà không cần phải liên kết với thư viện chuẩn, gcc sẽ xảy ra để làm điều đúng đắn; nhưng sau đó, g ++ cũng vậy. Vì vậy, thực sự không có lý do gì để không sử dụng g ++ để phát triển C ++ chung.


12

Tôi bắt đầu quan tâm đến vấn đề này và thực hiện một số thí nghiệm

  1. Tôi tìm thấy mô tả đó ở đây , nhưng nó rất ngắn.

  2. Sau đó, tôi đã thử trải nghiệm với gcc.exe và g ++. Exe trên máy tính windows của tôi:

    $ g++ --version | head -n1 
    g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
  3. Tôi đã cố gắng biên dịch các tệp thử nghiệm đơn giản c89, c99 và c ++ 1998 và nó hoạt động tốt với tôi với các tiện ích mở rộng chính xác phù hợp với ngôn ngữ

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
  4. Nhưng khi tôi cố chạy công cụ "bộ sưu tập trình biên dịch gnu" theo cách đó:

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. Nhưng cái này vẫn hoạt động không có lỗi

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. Và điều này cũng

    $ g++ -std=c++0x test_cpp_11.cpp 

Tập tin kiểm tra ps

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector<int> a {1,2,3}; // bracket initialization
    return 0;
}

Kết quả:

  1. Nếu nhìn vào cây quy trình thì có vẻ như gcc và g ++ là phụ trợ cho các công cụ khác, trong môi trường của tôi là: cc1plus.exe, cc1.exe, coll2.exe, as.exe, ld.exe

  2. gcc hoạt động tốt như metatool nếu bạn có phần mở rộng chính xác hoặc đặt cờ -std -x chính xác. Xem cái này


9

Nhật ký GCC là một thuật ngữ viết tắt phổ biến cho Bộ sưu tập Trình biên dịch GNU. Đây vừa là tên chung nhất cho trình biên dịch, vừa là tên được sử dụng khi nhấn mạnh vào việc biên dịch các chương trình C (vì tên viết tắt trước đây là viết tắt của GNU GNU C Compiler.

Khi đề cập đến việc biên dịch C ++, người ta thường gọi trình biên dịch là phiên bản G ++. Vì chỉ có một trình biên dịch, nên cũng chính xác khi gọi nó là GCC, bất kể bối cảnh ngôn ngữ là gì; tuy nhiên, thuật ngữ này đã có ích hơn khi tập trung vào các chương trình C ++.

Bạn có thể đọc thêm ở đây .


0

Tôi đã thử nghiệm gcc và g ++ trong một hệ thống linux. Bằng cách sử dụng MAKEFILE, tôi có thể xác định trình biên dịch được sử dụng bởi "GNU make". Tôi đã thử nghiệm tính năng định vị "bộ nhớ động" của "C plus plus" bằng cách:

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

Chỉ g ++ mới có thể biên dịch thành công trên máy tính của tôi trong khi gcc sẽ báo lỗi

undefined reference to `operator new(unsigned long)'

Vì vậy, kết luận của riêng tôi là gcc không hỗ trợ đầy đủ "C plus plus". Có vẻ như chọn g ++ cho các tệp nguồn C ++ là một lựa chọn tốt hơn.


Bạn phải thực hiện hai công việc: 1. chọn ngôn ngữ 2. chọn một số thư viện suhch là libstdc ++
tiếng

-1

gcc và g ++ đều là trình biên dịch GNU. Cả hai đều biên dịch c và c ++. Sự khác biệt là đối với các tệp * .c gcc coi nó là chương trình ac và g ++ xem nó là chương trình ac ++. Các tệp * .cpp được coi là các chương trình c ++. c ++ là một tập hợp siêu c và cú pháp chặt chẽ hơn, vì vậy hãy cẩn thận với hậu tố.


1
C ++ là một ngôn ngữ khác, không phải là siêu ngôn ngữ nghiêm ngặt của C, do đó, việc biên dịch với ngôn ngữ đích sai có thể tạo ra kết quả không mong muốn. Cũng lưu ý rằng g++cũng sẽ diễn giải .ccnhư một phần mở rộng tên tệp C ++.
undererscore_d
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.