zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    75. 颜色分类
    排序链表
    两个数组的交集
    242. 有效的字母异位词
    排序优化
    622.设计循环队列
    比较含退格的字符串
    682.棒球比赛
    496.下一个更大的元素I
    线性排序算法
  • 原文地址:https://www.cnblogs.com/tqianly/p/4374735.html
Copyright © 2011-2022 走看看