Gcc是Linux下常用的C编译器,其实GCC也可以用来编译很多其他的语言,比如java,比如c++。
其实一直用的都是微软的IDE,但是用多了之后,感觉自己就被微软绑架了,离开了IDE就只能写个helloworld。接口,函数什么的全部都不记得,需要提示。这方面看来,虽然Gcc确实没有VS强大,但有些地方Gcc还是有他的优点的。据说Emacs可以搞得很强大,没去试过:)
整理了一下GCC下边常用的操作,因为有些不常用,所以记性不好的人就多总结吧。
关于文件的扩展名:
.a 静态库文件
.so 动态库文件
.s 汇编源文件
.o 目标文件
这里简单在总结一下编译的各个阶段
源文件 ----------首先通过编译器的预处理程序,将代码中的#define,include之类的进行展开,成为机器处理的真正的源文件,如果想看到这一步的结果,可以通过gcc -E -o hello.cxx hello.c生成的.cxx文件来查看,helloworld也变成了800多行的文件。这个文件就是下边的预处理文件。
预处理文件----预处理文件通过汇编化生成下边的汇编程序,(中间历经词法,语法,语义分析)。如果想看到这一步的汇编代码,可以通过 gcc -S -o hello.s hello.c来生成。
汇编文件-------汇编文件再通过编译,生成目标文件,这个目标文件其实已经是ELF文件了(Excutable and Linkable File). 可以通过gcc -c -o hello.o hello.c来生成目标文件。
目标文件-------目标文件通过最后的链接,才能变成可执行文件,我理解的链接主要是指重定向函数入口,重定向各种库在内存中的位置。什么参数都不要可以直接生成执行文件gcc hello.c, 会生成a.out, 通过./a.out可以执行。也可以gcc -o hello hello.c来指定生成的文件名。
可执行文件----好了执行吧
除了Hello world我们还常常需要静态库和动态库
这里的hello1.c和hello2.c是hello.c需要用到的函数文件
静态库的编译:
gcc -c hello1.c hello.2.c
ar -r libhello.a hello1.o hello2.o
gcc -o hello hello.c -lhello
动态库的编译使用:
gcc -c -fpic hello1.c hello2.c//这里不加-fpic也是可以运行的。
gcc -o hello.so -shared hello1.o hello2.o
cp hello.so /usr/lib
gcc -o hello hello.c hello.so