参考:http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html
注意:gcc和g++是linux系统下的编程常用指令,C语言文件用gcc,cpp文件用g++。
1.预处理
g++ -E filename.cpp > filename.i
功能:输出预处理后的文件,linux下以.i为后缀名。只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里 。
这一步主要做了这些事情:宏的替换,还有注释的消除,还有找到相关的库文件。用编辑器打开Test.i会发现有很多很多代码,你只需要看最后部分就会发现,预处理做了宏的替换,还有注释的消除,可以理解为无关代码的清除。下面是Test.i文件的最后部分,可以看见宏的替换和注释的消除。
2.将.i文件生成.s汇编语言文件
g++ -S filename.cpp
功能:会生成Test.s文件,.s文件表示是汇编文件,用编辑器打开就都是汇编指令。
g++ -s filename.cpp / g++ filename.cpp
功能:会生成a.out文件,.out文件并不是可执行文件的扩展名,可以用objdump -S a.out打开就都是汇编指令,a表示默认文件名。
3.生成.o文件
g++ -c filename.cpp
功能:会生成template.o文件,.o是GCC生成的目标文件,除非你是做编译器和连接器调试开发的,否则打开这种.o没有任何意义,二进制机器码一般人也读不了。
4.连接目标代码,生成可执行程序
g++ Test.o -L /usr/lib/x86_64-linux-gnu/root5.34/cint/linclude/iostream
功能:将.o文件与所需的库文件链接整合形成可执行文件。-L 表示链接,这里我后面写的是绝对路径,相对各人电脑不同
这样生成的是默认文件名文件 a.out,也可以自己定义文件名在上面各个步骤中你可以用-o命令输出你自己想要的各种名字。
g++ Test.cpp -o test.exe,最后面的文件有多种命名形式,test,test.exe,test.out都可以,运行的时候:./filename
注意:
.out 是 gcc 编译器的输出文件的默认扩展名,并不是可执行文件的扩展名。gcc 可以输出不能运行的文件,但默认还是 .out 。
.out文件就是扩展名为out的文件,它本身不代表任何信息。在Linux中判断文件是否是可执行文件,首先要看文件的属性是否是可执行的,它没有一个默认的扩展名表示此文件为可执行文件。为了方便,Linux中可执行文件一般都是没有扩展名的。 在使用gcc编程时,没有指定输入可执行文件名,默认生成可执行文件a.out文件。
Linux 的可执行文件是基于权限确定的。而不是基于扩展名。