makefile学习之一

makefile是一个脚本,主要任务是告诉编译器怎么去编译,也就是建立模块的依赖关系。一般大型的项目都需要makefile进行管理,但是小的工程一般就不需要了。现来熟悉下最简单的编译是怎么做得。以最简单的hello world为例,只需要在cmd下cc hello.c 即可,默认生成a.out 当然可以指定生成的可执行文件名字 可以使用-o 选项 即cc hello.c -o hello即可生成hello的执行文件。现在假设有两个文件一个是hello.c 另外一个是file1.c。现在hello.c里面调用了file1.c的一个函数test1,详细内容可以参考附件的代码。按照一般的原则,我们需要给file1.c弄一个相应的.h文件文件,然后在hello.c里面直接通过包含这个头文件即可。首先我们需要先编译file1.c 这里注意了file1.c不是一个可以执行的文件(没有main函数,只是提供了一组函数),所以按照以前那种方法编译会出现问题:alloc@linux-erlo:~/test> cc file1.c -o test -I.
/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../lib64/crt1.o: In function `_start':
/usr/src/packages/BUILD/glibc-2.11.2/csu/../sysdeps/x86_64/elf/start.S:109: undefined reference to `main'
collect2: ld returned 1 exit status

提示找不到main函数。所以需要加一个编译选项-c即告诉gcc只编译不链接成一个可执行文件 。

编译好了file1.c,我们就可以编译hello.c了,首先先介绍一个概念gcc在编译的时候需要找到头文件,因此需要知道这些头文件放在哪里。一般的像常用的libc,linux库函数都是放在$PATH下的可以通过查下:/home/alloc/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin
所以在我们编译最简单的hello.c的时候也包含了stdio.h,这个是放在这些系统路径下的gcc会默认去找,因此不需要再告诉了。但是我们刚才那个file1.h只是一个一般的目录,所以gcc并不知道,需要告诉它,可以通过-I这个选项来指定,我们来实验下:
alloc@linux-erlo:~/test> gcc hello.c -o hello -I.
/tmp/cc56USkJ.o: In function `main':
hello.c:(.text+0x1f): undefined reference to `test1'
collect2: ld returned 1 exit status

这里好像还是有问题,说是找不到符号test1,不是我们已经指定了当前路径了吗?直接不使用-I效果是一样的。刚开始我觉得只要指定了-I就能找到file1.h这个文件,但是为什么还找不到这个test1呢?在网上搜了搜,知道了原因:gcc其实是做了两件是:编译和链接,根据上面提示的错误信息来看,是ld没有找到test1这个函数,刚才我们只是包含了file1.h的目录,但是在链接的时候需要找到test1这个函数在那里,就是我们之前编译的那个file1,所以还需要把这个信息也加上,ld才能找到test函数

alloc@linux-erlo:~/test> gcc hello.c file1  -o hello -I.

这样才能生成一个可执行的文件。到这里我们完成了使用命令行直接编译可执行文件所需要的知识,下面就是使用makefile了。下午接着写微笑

先把使用的源文件贴出来:

file1.c:

#include <stdio.h>
#include <file1.h>
int test1(int a)
{
    printf("get a %d\n",a);
        return a;
}

file1.h:

#ifndef _FILE1_H_
#define _FILE1_H_

int test1(int);

#endif

hello.c:

#include <stdio.h>
#include "file1.h"
//extern int test1(int);
int main(int argc,char **argv[])
{
        int ret;
    printf("hello world\n");
        ret = test1(12);
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值