GCC,全称GNU Compile Collection,也就是一个编译套装。通常来看,gcc是用来编译C的,g++是用来编译C++的。从用法上来看这是没错的,但这种认识是比较片面的。
需要认识到的第一个原理是,g++最终调用的还是gcc,换句话说,gcc才是最终的编译器。
接下来从三个方面来讲述两者的区别:
- 对待源文件(编译阶段),
gcc对待.c文件将其当作C程序,对待.cpp文件将其当作C++程序;g++对待.c和.cpp文件一律当作C++程序处理
- 链接标准库(链接阶段),
gcc默认只会连接到标准C库;g++可以自动连接到标准C库和标准C++库。但是gcc可以用-l参数添加C++标准库,像这样-lstdc++,这样的话gcc也可以编译C++了。
- 关于
__cpluscplus宏定义。gcc会根据源文件后缀名去判断是否要定义这个宏;g++会直接定义这个宏,但是这并不影响它可以正常编译C程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| gcc a.cpp -o a /usr/bin/ld: /tmp/cc6TWnM5.o: warning: relocation against `_ZSt4cout' in read-only section `.text' /usr/bin/ld: /tmp/cc6TWnM5.o: in function `main': a.cpp:(.text+0x11): undefined reference to `std::cout' /usr/bin/ld: a.cpp:(.text+0x19): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' /usr/bin/ld: a.cpp:(.text+0x20): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' /usr/bin/ld: a.cpp:(.text+0x2b): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' /usr/bin/ld: warning: creating DT_TEXTREL in a PIE collect2: error: ld returned 1 exit status
gcc a.cpp -l stdc++ -o a
./a Hello World
|