0

所以给定三个文件:

主文件

#include <stdio.h>
void printFunc(*char);

主程序

    #include "main.h"
    int main(){
        printFunc("Hello World\n");
        return 0;
    }

打印函数

    #include "main.h"
    void printFunc(char *string){
        printf("%s", string);
        return;
    }

您可以在 linux 机器上使用 gcc 进行编译,如下所示:

    gcc -g -Wall -c file1.c             //compile but do not link file
    gcc -g -Wall -c file2.c             //same
    gcc file1.o file2.o -o main         //executable "main" 

或者

    gcc -g -Wall file1.c file2.c -o main

但我很关心头文件是如何被包含进来的。当我注意到一些教程会做这样的事情时,我在创建“makefile”时遇到了这个问题:

    main : main.o printFunc.o
            gcc -o main main.o printFunc.o

    main.o : main.c
            gcc -g -Wall -c -o main.o main.c

    printFunc.o : printFunc.c
            gcc -g -Wall -c -o printFunc.o printFunc.c

其他人将包含头文件作为依赖项:

    main : main.o printFunc.o  //main.h EDIT
           //commands
    main.o : printFunc.o main.h
           //commands

最后:

那么,是否有必要将头文件包含为可执行文件的依赖项?何时将包含文件放置在源中?

也可以使用这个命令:

    executableName : dependencies.o               //and a header file? 
            gcc -g -Wall -o executableSource.c

这可以用这条线来完成:

    gcc -g -Wall -o executableName executableSource.c

是否会运行第二个命令,但第一个命令是速记符号?

最后,我认为“-o”命令是“将输出发送到”,如果你愿意的话。如果这样,运行以下命令似乎很直观:

    gcc compileThisFile andSendOutputTo thisExecutableFile
    gcc someSource.c          -o            executableFile

但是上面列出的符号更像:

    gcc sendOutputTo thisExecutableFile fromThisSource

那是对的吗?

4

2 回答 2

2

main : main.o printFun.o main.h肯定是错的。也就是说,标头是链接的先决条件。头文件是编译的先决条件。

假设您真正的意思是将标头指定为编译依赖项(例如printFunc.o : printFunc.c printFunc.h),这意味着如果标头更改,目标文件将自动重新生成。如果你不这样做,那么它不会。

于 2013-08-28T20:51:52.667 回答
1

Makefile 中的一个依赖项是说,只要列出的任何文件发生更改,请再次运行该命令。这并不意味着列出的文件将包含在编译或链接中。您仍然需要来源中的常规#include "main.h"

因此,这也有效:

printFunc.o : printFunc.c someReadmeFile.txt
        gcc -g -Wall -c -o printFunc.o printFunc.c

每当printFunc.c 或被 someReadmeFile.txt更新时,gcc -g -Wall ....都会再次执行。

我希望现在更清楚了。

于 2013-08-28T21:15:22.610 回答