C 编译过程

以helloword.c 程序说明编译过程


在默认的状态下,如果我们直接以gcc编译源码,并且没有加上任何参数,则执行文件的文件名会被自动设置为a.out 这个文件名。所以你就能够直接执行 ./a.out这个这行文件。

hello.c 就是源码,gcc是编译程序,a.out 是编译成功的可执行文件。

如果我们想要产生目标文件(object file),而且执行文件的文件名也不要用默认的a.out.


这个步骤主要是利用hello.o 这个目标文件制作出一个名为hello 的执行文件。通过这个操作我们可以得到hello 及 hello.c 两个文件,真正可以执行的是hello 这个二进制文件。

主程序、子程序链接:子程序的编译

thanks.c 主程序

#include<stdio.h>
int main(void)
{
    printf("Hello World\n");
    thanks2();
}
thanks2.c 子程序

#include<stdio.h>
void thanks2(void)
{
    printf("Thank you!\n");
}
进行程序的编译与链接(Link)



知道为什么要制作出目标文件了吗?由于我们的源码文件有时并非仅只有一个文件,所以我们无法直接进行编译。这个时候就需要先生成目标文件,然后再以链接制作成为二进制可执行文件。另外,如果有一天,你更新了thanks2.c 这个文件的内容,则你只要重新编译thanks2.c 来产生新的thanks2.o ,然后再以链接制作出新的二进制可执行文件即可,而不必重新编译其他没有改动过的源码文件。

调用外部函数库:加入链接的函数库

sin.c

#include<stdio.h>
int main(void)
{
    float value;
    value=sin(3.14/2);
    printf("%f\n",value);
}

这是因为C 语言里面的sin 函数是写在 libm.so 这个函数库中,而我们并没有在源码里面将这个函数库功能加进去,所以当然就需要在编译与链接的时候将这个函数库链接仅执行文件里面。

编译时加入额外函数库链接的方式:


特别注意,使用gcc 编译时所加入的那个-lm 是有意义的,它可以拆开成两部分来看:

-l:  是加入某个函数库(library)的意思;

m:  则是libm.so 这个函数库,其中,lib 与扩展名(.a或.so )不需要写。

所以-lm 表示使用 libm.so(或 libm.a)这个函数库的意思。至于那个-L 后面接的路径,这表示我要的函数库 libm.so 请到 /lib 或/usr/lib 里面搜索。
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值