linux C下多文件编译,以及Makefile的使用

由于在C语言中,不能把所有的代码都放在一个.c文件里面,这样这个.c文件会很大,而且代码维护起来会很麻烦。

于是在网上找了些C语言多文件编程的示例,记录下我的学习过程。

我们可以把我们的代码按功能进行划分,一些源文件存放函数的实现,一些头文件声明这些函数,这样代码会更有条理。

头文件的大致格式:(注意,头文件中一般只能有申明,不能有定义,否则会出现重定义错误——multiple definition of。。。)

#ifndef _ABC_H_
#define _ABC_H_
//以上代码是为了防止这个头文件被多次包含,确保名字唯一

//宏定义
#define _MAX 100

//结构体声明
typedef struct{
int a;
}ABC;

//函数声明
extern void abcfun(void);


...

#endif

  

在写头文件的时候,有一点需要特别的注意,(一般情况下)定义不能放在头文件里面,需要放在一个单独的c文件里面,头文件里面只能有一个申明,如: extern Type A。

要对以上要求进行解释,我们需要了解编译的过程:

    编译的第一步是把所有的CPP文件编译成为点O文件,而且每一个点CPP文件都是单独编译的,该点CPP文件中用到的类型必须在它所include 的头文件当中找到,相当于把它所有include的文件中的代码都加到该CPP文件的前面,

但是声明的部分将不会出现在编译后的点O文件,相当于每个 CPP文件都是单独编译,因此它的ifndef在一个文件里是没有用的,两个CPP文件里如果包含同一个有ifndef的头文件,效果是两个CPP文件都 把该头文件加到它的前面,但不会把声明的部分放到点O文件中,而会把头文件中定义的部分都输出到编译后的点O文件当中,因此如果在头文件当中有一个定义,那么如果有两个CPP文件当中include了它,那么将会出现重定义错误,multiple definition of

接下来介绍下多文件编程的小例子

功能:在main.c里面调用其他两个源文件里面的函数,然后输出字符串。

1、main.c

#include"mytool1.h"
#include"mytool2.h"

int main(int argc,char* argv[])
{
           mytool1_printf("hello.");
           mytool2_print("hello");
           return 1;
}

2、 mytool1.h     mytool1.c

//mytool1.h
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_printf(char* print_str);
#endif


//mytool1.c
#include"mytool1.h"
#include<stdio.h>
void mytool1_printf(char* print_str)
{
         printf("This is mytool1 print %s
",print_str);
}

3、 mytool2.h mytool2.c

//mytool2.h
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_h
void mytool2_print(char* print_str);
#endif


//mytool2.c
#include "mytool2.h"

#include<stdio.h> void mytool2_print(char* print_str) { printf("This is mytool2 print %s ",print_str); }

在linux下,把这几个文件放在同一个目录下,然后在shell中输入

gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc main.o mytool1.o mytool2.o -o main

  就可以生成可执行文件 main

关于 Makefile 

如果项目中的源文件改动一次,那项目就要重新编译一次,这样会很麻烦。一个Makefile文件就可以解决这个问题。Makefile文件里面存在编译的指令,这样源文件改变一次,我们只要重新Make一下,项目就会编译好,会很方便。

cc=gcc
target=main
obj=main.o mytool1.o mytool2.o
$(target):$(obj)
    $(cc) $(obj) -Wall -o $(target)
main.o:main.c
    $(cc) -c main.c
mytool1.o:mytool1.c
    $(cc) -c mytool1.c
mytool2.c:mytool2.c
    $(cc) -c mytool2.c
.PHONY:clean
    $(RM) *.o $(target)

引用:

http://blog.163.com/m13591120447_1/blog/static/21637918920132365724538/

http://soft.chinabyte.com/os/12/11584512.shtml

原文地址:https://www.cnblogs.com/tqianly/p/4374735.html