gcc编译步骤:原来GCC是个编译器全家桶
gcc编译步骤:原来GCC是个编译器全家桶对GCC想进一步了解的朋友可能看下官方的文档,链接在这里https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/。那我们就来调查下到底是怎么回事吧!GCC的官方文档走起,GCC的全称是“GNU Compiler Collection”,看这字面意思,一下子就像明白了啥似的,原来是GNU编译器全家桶呀,可以支持C C Objective-C Objective-C Fortran Ada D Go and BRIG (HSAIL)等众多编程语言,“GNU C Compiler”只是GCC最初的名称,除C语言以外的编译器,官方都还单独给取了个名,比如C 语言的编译器叫G (不要跟前面我们使用的g 应用程序搞混了),Ada语言的编译器叫GNAT。GCC支持这么多语言的编译器,是怎么区别应该用哪个编译器来编译当前的源代码呢?这里
从开始在Linux环境下写C语言程序,就在使用应用程序GCC(gcc main.c -o Helloworld),偶尔也会试下C ,从网上获得的知识就是使用应用程序g (g main.CPP -o helloworld)。偶然一次在悟空回答里看到有个网友说使用应用程序gcc也可以编译C 的代码,内心觉得是不可能的,于是我基于C 写了个简单的Helloworld,
#include <iostream>
int main(void)
{
std::cout << "hello cpp test!";
return 1;
}
然后使用g (g cpp_test.cpp -o cpp_test)编译了,确保代码是正确的,同时也执行了编译后的可执行文件。
接下来使用gcc(gcc cpp_test.cpp -o cpp_test1)来编译,
gcc cpp_test.cpp -o cpp_test1
/tmp/cckC5WGA.o: In function `main':
cpp_test.cpp:(.text 0xe): undefined reference to `std::cout'
cpp_test.cpp:(.text 0x13): 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*)'
/tmp/cckC5WGA.o: In function `__static_initialization_and_destruction_0(int int)':
cpp_test.cpp:(.text 0x43): undefined reference to `std::ios_base::Init::Init()'
cpp_test.cpp:(.text 0x58): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
编译没有通过,但网友指出这是因为没有链接C 的库造成的,如果把C 的库链接上,就可以了。我也百度了下,看看有没有使用GCC来连接C 的,还真找到了,真的是尴尬得不要不要的。有兴趣的朋友可以自己研究下如何用GCC来编译C 。
那我们就来调查下到底是怎么回事吧!GCC的官方文档走起,GCC的全称是“GNU Compiler Collection”,看这字面意思,一下子就像明白了啥似的,原来是GNU编译器全家桶呀,可以支持C C Objective-C Objective-C Fortran Ada D Go and BRIG (HSAIL)等众多编程语言,“GNU C Compiler”只是GCC最初的名称,除C语言以外的编译器,官方都还单独给取了个名,比如C 语言的编译器叫G (不要跟前面我们使用的g 应用程序搞混了),Ada语言的编译器叫GNAT。
GCC支持这么多语言的编译器,是怎么区别应该用哪个编译器来编译当前的源代码呢?这里拿C 来举个例子吧。GCC通过源文件后缀名‘.C’ ‘.cc’ ‘.cpp’ ‘.CPP’ ‘.c ’ ‘.cp’ 或 ‘.cxx’和头文件 的后缀名‘.hh’ ‘.hpp’ ‘.H’,来识别是否使用C 的编译器(名称叫G ),当使用应用程序gcc来编译这些源文件时,内部会调用C 的编译器(G )来编译这些文件。但这里有个小坑,官方的文档中提到了应用程序gcc并不会链接C 的库,也就是我上面使用gcc来编译cpp文件时无法通过的原因。
那我们常用来编译C 的应用程序g 又是个啥玩意呢,目前看来就是来填上面那个小坑的吧!应用程序g 调用GCC的同时,还自动链接了C 的库,一般情况下还会将‘.c’ ‘.h’等C语言的文件当作C 语言来编译。
对GCC想进一步了解的朋友可能看下官方的文档,链接在这里https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/。