gcc使用基础
gcc 编译器是 Linux 下默认的 C/C++ 编译器,大部分 Linux 发行版中都是默认安装的。gcc 编译器通常以 Linux 命令的形式在终端(Shell/Bash)中使用。
单一源文件
最基础用法
hello.c代码如下:
1 |
|
使用gcc编译:
1 | gcc hello.c |
使用ls命令查看当前目录,多出一个a.out可执行文件,运行:
1 | ./a.out |
1 | Hello World! |
注意:gcc编译源码,不加任何参数时,生成的可执行性文件默认为a.out,并且没有中间过程的目标文件。
生成目标文件&自定义名称
使用**-c参数**可以生成.o结尾的目标文件:
1 | gcc -c hello.c |
使用ls命令查看当前目录,多出一个hello.o目标文件。
继续使用**-o参数**生成可执行文件,并自定义名称:
1 | gcc -o hello hello.o |
其中 “hello” 是指定生成的可执行文件的名称,可以执行测试:
1 | ./hello |
1 | Hello World |
多个源文件
当存在多个源文件,并且文件间存在依赖关系时,必须要先生成各自的目标文件,再链接成可执行文件。
thank.c源码如下:
1 |
|
thank_2.c源码如下:
1 |
|
注意到thanks.c需要用到thanks_2.c中的函数,先编译:
1 | gcc -c thanks.c thanks_2.c |
编译成功后会生成thanks.o和thanks_2.o目标文件,继续链接:
1 | gcc -o thanks thanks.o thanks_2.o |
执行生成的thanks可执行文件:
1 | ./thanks |
1 | Hello world |
注意:编译阶段可以添加**-O参数进行程序优化,或是-Wall**参数显示详细的编译信息,如:
1 | gcc -O -c thanks.c thanks_2.c |
调用外部函数库
sintest.c代码如下:
1 |
|
函数中用到了sin三角函数,包含了math.h数学库,因而在编译阶段需要连接对应的数学库。
1 | gcc sintest.c -lm -L/lib -L/usr/lib |
其中,-lm可理解为两部分,**-l是加入某个函数库,m**则是libm.so的代称。
后面的**-L参数**用于指定库的搜索路径,由于Linux的默认库的位置就是在lib文件目录下,因此可以省略不写,如果是其它的第三方库,则需要指明库文件的位置。
另外,对于第三方的头文件,也许指明头文件的路径,比如stdio.h这个文件,如果它不是系统认识的文件,则在编译时需要通过**-I参数**知名位置:
1 | gcc sintest.c -lm -I/usr/include |