习惯了用IDE,习惯了点击执行按钮。在linux就不能这样了,该咋办?
解决方案:
随着android的大热,在linux下搞开发的人也越来越多,好多人问linux下如何编译一个简单的c语言程序,例如下面的小伙伴:
例如上面的同学,很明显,命令写错了,正确的应该为:
gcc -o hello hello.c 目标和源文件写反了。
这当然是最简单的程序了,只有一个源码文件,在linux下编译源文件一般需要自己编写makefile,那有些人就说了,linux真麻烦,还要编写makefile,windows下就不用,其实编译都需要makefile,只是windows下IDE工具帮你做了而已。其实linux下也能实现自动生成makefile,不用手写,但是需要一些工具例如automake等工具的协助而已。
下面简单介绍下linux编译程序的过程:
使用gcc编译程序是,其过程主要分为四个阶段:预处理,编译,汇编,连接
程序清单:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(int argc,char** argv) 4 { 5 printf("Hello Linux ,i am coming---------------\n"); 6 return 0; 7 }
1.预处理(cpp):生成 *.i 的预处理文件,该过程只激活预处理,不生成文件,所以需要重定向一个输出文件
使用指令 -E,如gcc -E main.c -o main.i 或
cpp main.c -o main.i
2.编译(ccl):生成 *.s 文件,该过程只激活预处理和编译, 关联文件可以是*.i 或 *.c
使用指令 -S ,如 gcc -S main.c -o main.s 或
gcc -S main.i -o main.s 或
ccl -S main.c -o main.s
3.汇编(as):生成 *.o 文件,该指令只激活预处理、编译和汇编, 关联文件可以是 *.c 、*.i 、*.s 三者之一
使用指令 -O ,如 gcc -c main.c -o main.o 或
gcc -c main.i -o main.o 或
gcc -c main.s -o main.o 或
as main.c -o main.o
4.连接(ld):生成可执行文件,相关联文件可以是 *.c 、*.i 、*.s 、*.o之一
gcc main.c -o main 或
gcc main.i -o main 或
gcc main.s -o main 或
gcc main.o -o main 或
ld main.c -o main
当一个项目中包含两个或两个以上的C文件时,这种编译方法就显得力不从心了,这时就要用到makefile了
为了结合上面的gcc指令,我写了如下的makefile文件
1 main:main.o 2 gcc main.o -o main 3 main.o:main.s 4 gcc -c main.s -o main.o 5 main.s:main.i 6 gcc -S main.i -o main.s 7 main.i:main.c 8 gcc -E main.c -o main.i
指导意见:
linux上面编写C语言程序,没有像在windows下面这么多的工具可以用,但是在linux采用比较原始点的方法去编译程序,在一定程度上的确可以锻炼思维水平,初期学习阶段用太智能的编译工具,对于基本功的学习反而不是什么好事。如果有机会在linux搞,还是建议玩一把。