OSX + Xcode + C++ (3)

使用Makefile来编译C++文件

上一节中,由于Xcode使用GDB来对程序进行调试,不需要再去写Makefile就能在Xcode中编译和执行程序,这一点类似于VS。然而OSX属于unix系统,本质上还是需要人工去编译程序的,也就是说,想要在terminal中执行程序,还是要写Makefile先编译程序。

1. 使用g++编译器编译cpp文件的命令:

1.预处理,生成.i的文件[预处理器cpp]
命令:g++ -E Test.cpp > Test.i
功能:输出预处理后的文件,linux下以.i为后缀名。只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里 。这一步主要做了这些事情:宏的替换,还有注释的消除,还有找到相关的库文件。用编辑器打开Test.i会发现有很多很多代码,你只需要看最后部分就会发现,预处理做了宏的替换,还有注释的消除,可以理解为无关代码的清除。下面是Test.i文件的最后部分,可以看见宏的替换和注释的消除。

2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
命令: g++ -S Test.cpp
功能:会生成Test.s文件,.s文件表示是汇编文件,用编辑器打开就都是汇编指令。

3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
命令:g++ -c Test.cpp
功能:.o是GCC生成的目标文件,除非你是做编译器和连接器调试开发的,否则打开这种.o没有任何意义。二进制机器码一般人也读不了。

4.连接目标代码,生成可执行程序[链接器ld]
命令:g++ Test.o -L F:\vs2008\VC\include\iostream
功能:将.o文件与所需的库文件链接整合形成.exe文件,这就是可执行文件。-L 表示链接,这里我后面写的是绝对路径,相对各人电脑不同

在上面各个步骤中你可以用-o命令输出你自己想要的各种名字。比如最后一个,用g++ Test.o -o Test.exe -L F:\vs2008\VC\include\iostream输出Test.exe。

在实际操作中,一般会省略1、2步,直接生成目标代码,然后链接成为可执行程序。

2. 一个简单的Makefile示例

本部分的学习不采用基础概念的形式,以实例切入,方便记忆。对于上一节中的HelloWorld项目,我们可以编写如下的Makefile。

helloworld: helloworld.o   //可执行程序由.o文件链接形成
    g++ helloworld.o -o helloworld

helloworld.o: main.cpp     //.o文件由.cpp文件汇编形成
    g++ -c main.cpp
clean:                     //编译结束后删除所有的.o中间文件
    rm *.o

猜你喜欢

转载自blog.csdn.net/qq_42857385/article/details/81350255