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?
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?
Câu trả lời:
gcc
và g++
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 -v
tùy chọn (nó hiển thị các lệnh công cụ phụ trợ đang chạy).
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.
GCC: Bộ sưu tập trình biên dịch GNU
gcc
: Trình biên dịch GNU C
g++
GNU C: GNU C ++
Sự khác biệt chính:
gcc
sẽ biên dịch: *.c\*.cpp
các tệp tương ứng là C và C ++.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 ++.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 ++ ( gcc
không làm điều này).gcc
biên dịch tập tin C có ít macro được xác định trước.gcc
biên dịch *.cpp
và g++
biên dịch *.c\*.cpp
tập tin có thêm một vài macro.Macro bổ sung khi biên dịch *.cpp
tệp:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
bằng cách truyền -lstdc++
tham số.
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. :-)
-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 .
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.
-dumpspec
trê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.
Đố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).
Sự khác biệt giữa g++
và là gcc
gì?
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++
là C ++ biên dịch cho GNU Compiler Collection. Giống như gnat
trì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 gcc
nó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
gcc
khô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 gcc
trang man để biết thêm chi tiết về phương sai tùy chọn giữa gcc
và g++
.
Cái nào nên được sử dụng để phát triển c ++ chung?
Về mặt kỹ thuật, gcc
hoặ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
gcc
hoặcmachine-gcc
khi biên dịch chéo hoặcmachine-gcc-version
chạ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 GCCg++
thay thế.
Một sự khác biệt đáng chú ý là nếu bạn truyền một .c
tệp cho gcc, nó sẽ biên dịch thành C.
Hành vi mặc định của g ++ là coi .c
các tệp là C ++ (trừ khi -x c
được chỉ định).
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.
Tôi bắt đầu quan tâm đến vấn đề này và thực hiện một số thí nghiệm
Tôi tìm thấy mô tả đó ở đây , nhưng nó rất ngắn.
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
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
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]
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
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ả:
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
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
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 .
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.
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ố.
g++
cũng sẽ diễn giải .cc
như một phần mở rộng tên tệp C ++.