gcc cc c++ g++编译入门

gcc cc c++ g++编译入门

常用编译选项

-E:对源文件做预处理操作。可以结合-o生成 .i格式的预处理文件。

-S:将输入文件加工至编译阶段。可以处理源文件即预处理文件。

-c:将指定文件加工至汇编阶段,但不进行链接操作。

-C:阻止编译器删除源文件和头文件中的注释。-o:用来指定输出文件。结合-E、-S、-c使用能实现编译出不同格式的输出文件。

-o和命名的输出文件名之间只能是空格,不能插入其他文件名。

-std=编译标准:这里的编译标准有很多的版本,比如C11,C++11,GNU17,GNU++17等。

简单示例

编译时,gcc和cc是一样的,c++和g++是一样的。下面都以gcc为例:

1.gcc test.c
编译test.c,会自动生成一个扩展名为.out的可执行文件

2.gcc test.c –o test
编译test.c文件并生成一个文件名为test的可执行文件

3.gcc –o test test.c
编译test.c文件并生成一个文件名为test的可执行文件

4.gcc –o test test.c –I …/code/project/include/ -L …/code/project/lib –lxl64
这里的第4点在下面【编译选项补充说明】中会详细解释。

5.gcc –E test.c –o test.i
对test.c进行预处理操作并生成预处理文件test.i

6.gcc –s test.i –o test.s
对test.i进行处理,生成汇编代码文件。

7.gcc –s test.c –o test.s

8.gcc –c test.c –o test.o
编译test.c文件并生成扩展名为.o的二进制对象文件。

9.gcc test.o –o test
对二进制对象文件test.o进行处理并生成可执行文件test。

编译选项补充说明

①–I …/code/project/include/
(这里-I是大写的i)表示将…/code/project/include/目录作为优先寻找头文件的目录,因此寻找的顺序是:…/code/project/include -> /usr/include -> /usr/local/include。这里头文件如果分别放在不同的目录中,只需要重复使用“-I + 路径”即可。

②-L …/code/project/lib
表示将…/code/project/lib/目录作为优先寻找库文件的目录,因此寻找的顺序是:…/code/project/lib -> /usr/lib -> /usr/local/lib

③-lxl64
表示在上面的库文件目录中寻找libxl64库,程序test.c链接的库的库名是xl64。(这里-lxl64前面的l是L的小写,后面紧接着的是库名,而不是库文件名。比如我们这里链接的是一个EXCEL库,这是个静态库,库名是xl64,库文件名是libxl64.a。显然,把库文件名的前缀lib和后缀.a或.so去掉就是库名了。)如果编译命令中加入了” -static”表示寻找静态库。

④如果我们要用到一个第三方提供的库libxl.a那么我们只要把这个库文件拷贝到程序的lib文件夹下面,编译时加上”-xl”,那么就能用上libxl.a库了。

⑤能用上库还没完,如果想要用到这个库里面的函数,我们还需要与这个库配套的头文件,可以将库文件理解为“一种另类的源文件”。即与这个库配套的头文件里包含了函数的声明,而这个库文件里就是这些函数的实现(即定义)。

gcc编译顺序

在编译器对工程进行编译的时候,各个文件之间存在着依赖关系,比如如果文件a中include一个头文件b,我们就认为a依赖于b。这种依赖关系决定了编译这两个文件的先后顺序,即先编译a后编译b。

在gcc编译命令中,文件名出现的先后顺序决定了编译的先后顺序。比如test.c包含了头文件libxl.h(在目录…/project/include/下),如果编译文件中使用下面的命令:

gcc –I …/project/include/ -L … /project/lib –lxl64 –o test test.c

会显示“对XXX未定义的引用”,这里的’XXX’是出错的函数名,比如xlCreateBookA。正确的用法应该是:

gcc –o test test.c –I …/project/include/ -L … /project/lib –lxl64

结语:总之,不管后面需要链接上多少库或是包含多少头文件,它总是会将输入文件编译成输出文件,所以像gcc –o test test.c这样将输入输出文件写在前面总没有错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值