Linux下C语言多文件工程的编译

前言

Linux下多个.c文件的工程,如何解决依赖关系,编译。作为初学者,我遇到了很多问题,这里记下来以供后来的朋友参考。

下面用一个简单的例子加以说明。

调用关系

调用关系

源码

main.c

#include <stdio.h>
#include "core.h"
int main()
{
    printf("Hello\n");
    good();
    return 0;
}


core.c

#include "core.h"
#include "utility.h"
int good(void)
{
    printf("You are good, I am in core.c\n");
    say_hi();
    return 0;
}

utility.c

#include "utility.h"
void say_hi(void)
{
    printf("Hi, I'm in utility.c \n");
}

core.h

#ifndef CORE_H
#define CORE_H
#include <stdio.h>
int good(void);
#endif

utility.h

#ifndef UTILITY_H
#define UTILITY_H
#include <stdio.h>
void say_hi(void);
#endif

关于头文件的说明

这里的

#ifndef CORE_H
#define CORE_H
....
#endif

结构是防止头文件被重复包含,类似一个上锁的操作。可以这样理解,core.h第一次被包含的时候CORE_H是没有被定义的,因此#ifndef CORE_H是满足的,那么就会执行

#define CORE_H
....

执行后,CORE_H便被定义了,其中....代表都文件实际的内容,例如函数声明等等。
有操作要求再次包含core.h的时候(很多情况下我都会遇到重复包含,特别是文件多了,调用复杂了的时候),由于core.h第一次第一次被包含的时候已经定义了CORE_H,故#ifndef CORE_H就不满足了,那么也就不会再执行下面的内容,也就避免了重复包含。

依赖关系

依赖关系
根据依赖关系写出最简单的makefile。
makefile

main:main.c core.o utility.o 
    gcc main.c core.o utility.o -o main

core.o:core.c 
    gcc -c  core.c 

utility.o:utility.c
    gcc -c utility.c

明明是core.c中的函数调用的utility.c中的函数,为什么core.o不依赖于utility.c呢?我原本认为的依赖关系是这样:
main依赖main.c core.o
core.o依赖core.c和utility.o
utility.o依赖utility.c
所以我写出的makefile是这样的:

main:main.c core.o  
    gcc main.c core.o  -o main

core.o:core.c utility.o
    gcc -c  utility.o core.c # 好像不能够这样写

utility.o:utility.c
    gcc -c utility.c

请大家帮忙解释我的疑惑,非常感谢。

源码地址:
github源码链接

“Linux下C语言多文件工程的编译”的一个回复

发表评论

电子邮件地址不会被公开。