使用c语言进行编译的简单实例:
编写程序源代码:hello world
开始编译和测试执行
在默认状态下,如果直接以gcc编译源码,并没有加上任何参数,则执行文件会默认为a.out这个文件名。
然后执行这个a.out文件就行
那么如果我想产生目标文件object file来进行其他操作,而且执行文件的名字也不是默认的.a.out
hello.o 就是目标文件,再利用这个目标文件制作出一个名为hello的执行文件。
那么为什么要多此一举,得到目标文件呢?
因为源码文件可能并非只有一个文件,无法直接进行编译,这个时候需要先生成目标文件,然后再以链接制成二进制可执行文件。
比如这个例子:
vim thanks.c
vim thanks2.c
可以看出,thanks.c代码的主函数中调用了thanks2.c中的函数。
对两份源码进行编译成目标文件
此时这只是两个独立的目标文件,thanks.o、thanks2.o
要将他们链接成一个二进制可执行文件
如果有一天,更新了thanks.c这个源码的内容,那么你只要重新编译thanks2.,c来产生新的thanks2.o,然后再用gcc -o重新链接生成新的二进制执行文件即可,不必编译其他没有改过的源码文件。
调用外部函数库:
如果要计算数学公式,比如三角函数和指数函数,就要加入函数库来计算。
比如主程序是这样的:
sin函数在linux中是写在libm.,so这个函数库当中的,由于没有在源码中将这个函数库加进去,因此需要在编译与链接时将这个函数库链接进执行文件里面。
-lm:-l 加入某个函数库(library),m表示libm.so这个函数库
-L/lib -L/usr/ilb 表示我要的函数库libm.so在/lib或者/usr/lib中搜索。
需要注意的是,linux默认是将函数库放置在/lib与/usr/lib当中,所以么有写-L/lib -L/usr/ilb,也是没有关系的,如果你自定义的函数库不是放在这两个目录下, 那么-L/path就很重要了。
gcc的简单用法:
在上面我们使用了 gcc -c ;gcc -o等
gcc -c:仅将源码编译成为目标文件,并不制作链接功能,即会生成hello.o文件,但不会生成可执行文件。
gcc -o hello hello.c 将编译结果输出成某个特定的文件名,-o后面跟的要输出的binary file文件名
gcc sin.c -lm -L/lib -L/usr/lib -I/usr/include 在进行编译时,将链接的函数库和头文件写入
-lm 指的是libm.so函数库,-L函数库的搜索目录,-I源码内include文件目录。