linux下多文件编译以及makefile的用法

本文介绍了如何在C语言中通过多个源文件进行编程,并详细解释了头文件的作用及使用方法。同时,还提供了具体的多文件编程实例,包括源代码组织方式及编译步骤,并简单介绍了Makefile的使用。

此博客已迁移到新博客欢迎大家访问关注,谢谢!!!

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

    <div class="postBody">
        <div id="cnblogs_post_body"><p>由于在C语言中,不能把所有的代码都放在一个.c文件里面,这样这个.c文件会很大,而且代码维护起来会很麻烦。</p>

于是在网上找了些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\n”,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\n”,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) </span>*.o $(target)

转载自:http://www.cnblogs.com/tqianly/p/4374735.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值