Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329581
  • 博文数量: 69
  • 博客积分: 2090
  • 博客等级: 大尉
  • 技术积分: 708
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-23 09:31
文章分类

全部博文(69)

文章存档

2012年(1)

2011年(4)

2010年(48)

2009年(14)

2008年(2)

我的朋友

分类: C/C++

2010-05-29 20:25:31

使用gcc在命令行编译少量的文件是非常方便。但是当工程中文件的个数个数很多时。再仅仅在命令行使用gcc命令编译整个工程将变得很不方便。但是利用linux中提供的make工具来管理整个工程,将会很方便地对工程进行编译。

因此将含有多个文件的工程编译成可执行的文件就有两种方式:命令行操作,手动输入将源文件编译成目标文件;
或是,编写makefile文件,通过make工具将多个文件编译为可执行文件

下面我将通过一个简单的例子来将这两种方式进行简单的说明和对比:
在我的makefile_test工程下有四个目录:add,sub,build,bin和一个文件:main.c
add中的add_int.c和add_float.c分别用来计算整型和浮点型数加法,以及add.h文件
add_int.c

/*add_int.c*/
int add_int(int x,int y)
{
    return x + y;
}


add_float.c

/*add_float.c*/

float add_float(float x,float y)
{
    return x + y;
}


add.h

#ifndef __ADD_H__
#define __ADD_H__

int add_int(int x,int y);
float add_float(float x,float y);

#endif /*__ADD_H__*/


sub中的sub_int.c和sub_float.c分别用来计算整型和浮点型数减法,和声明函数的sub.h文件
sub_int.c

/* sub_int.c */

int sub_int(int a,int b)
{
    return a - b;
}


sub_float.c

/* sub_float.c*/

float sub_float(float a,float b)
{
    return a - b;
}


makefile_test目录下sub.h

/*sub.h*/

#ifndef __SUB_H__
#define __SUB_H__

extern float sub_float(float a,float b);
extern int sub_int(int a,int b);

#endif


main.c

#include <stdio.h>
#include "add/add.h"
#include "sub/sub.h"

int main(int argc,char **argv)
{
    int a = 10,b = 2;
    float x = 1.3354,y = 2.3532;

    printf("int a + b = %d\n",add_int(a,b));
    printf("float x + y = %f\n",add_float(x,y));
    printf("int a - b = %d\n",sub_int(a,b));
    printf("float x - y = %f\n",sub_float(x,y));
    return 0;
}


以上是所有代码。

下面采用手动输入方式来编译工程的方式:
gcc -c add/add_int.c -o build/add_int.o           // 生成目标文件
gcc -c add/add_float.c -o build/add_float.o        //
gcc -c sub/sub_int.c -o build/sub_int.o
gcc -c sub/sub_float.c -o build/sub_float.o
gcc main.c -o build/main.o

gcc build/* -o bin/main    //生成可执行文件
进入bin目录下
./main   //运行
采用这种方式虽然也可以编程成功,并且生成可执行文件,运行可执行文件,并且能得到正确的结果
但是每次编译都要重新输入以上所有命令,这样编译程序将很不方便,并且很容易出错。。
因此以下将采用编写makefile的方式来编译程序

针对这个工程的makefile文件如下:

#生成main “:”左边为目标

main:add_int.o add_float.o sub_int.o sub_float.o main.o
    gcc -o bin/main build/add_int.o build/add_float.o build/sub_int.o build/sub_float.o build/main.o

#生成add_int.o
add_int.o:add/add_int.c add/add.h
    gcc -c -o build/add_int.o add/add_int.c

#生成add_float.o
add_float.o:add/add_float.c add/add.h
    gcc -c -o build/add_float.o add/add_float.c

#生成sub_int.o
sub_int.o:sub/sub_int.c sub/sub.h
    gcc -c -o build/sub_int.o sub/sub_int.c
#生成sub_float.o
sub_float.o:sub/sub_float.c sub/sub.h
    gcc -c -o build/sub_float.o sub/sub_float.c
#生成main.o
main.o:main.c sub/sub.h add/add.h
    gcc -c -o build/main.o main.c -Iadd -Isub

#清理的规则
clean:
    rm -f main build


在命令行输入make命令,将根据makefile中的规则生成最终的可执行文件

采用这种方式来管理和编译工程将很方便。







阅读(578) | 评论(0) | 转发(0) |
0

上一篇:linux系统调用

下一篇:虚基类

给主人留下些什么吧!~~