如何设置多个C文件共存

时间:2017-10-05 18:07:25

标签: c gcc

我如何设置一个结构,以便我在

中有方法

helper.c

的main.c

main.h

...如何在main.c中包含helper.c并使用helper.c中内置的方法?

我正在运行makefile:

all:
        gcc -o main main.c
        gcc -o helper helper.c



clean: 
        rm -f main
        rm -f helper

我知道我需要一个helper.h,但是如何正确设置呢...说我希望我的帮助文件看起来像这样:

struct Node{
    struct Node* nxt;
    int x;
};

int isThere(struct Node *head, int value){

    if(head==NULL){
        return 0;
    }
    struct Node *tmp=head;

    while(tmp!=NULL){
        if(tmp->x==value){
            return 1;
        }
        tmp=tmp->nxt;
    }
    return 0;
}

struct Node *nodeInsert(struct Node *head, int value){
    if(head==NULL){
        head=malloc(sizeof(struct Node));
        head->x=value;
        head->nxt=NULL;
        printf("inserted\n");
        return head;
    } else if(head!=NULL && isThere(head,value)==1){
        printf("duplicate\n");
        return head;
    } else{

        struct Node *new;
        struct Node *tmp=head;
        while(tmp->nxt!=NULL){
            tmp=tmp->nxt;
        }   

        new=malloc(sizeof(struct Node));
        new->x=value;
        tmp->nxt=new;
        new->nxt=NULL;
        printf("inserted\n");
        return head;
}}

4 个答案:

答案 0 :(得分:4)

我认为问题在于你错过了在C中编译和链接的理解。 有很多来源可以解释这一点,这里有一个很好的来源:http://courses.cms.caltech.edu/cs11/material/c/mike/misc/compiling_c.html

你应该做的是将所有这些文件编译成目标文件,然后将它们链接在一起。 你可以用单一命令

来做到这一点

gcc -o executable main.c helper.c

或首先编译每一个然后将它们链接在一起

gcc -c main.c gcc -c helper.c gcc -o executable main.o helper.o

确保在helper.h中为helper.c的所有函数编写原型 并在main.c的开头包含helper.h

答案 1 :(得分:2)

gcc -o helper helper.c会尝试编译和链接,但是从helper.c开始 没有定义main(),它不会链接。

您要做的只是将main.chelper.c分别编译为目标文件:

gcc -c main.c #-o main.o (the -o main.o part is implied if missing)
gcc -c helper.c #-o helper.o

然后将生成的目标文件链接到最终的可执行文件中。

gcc -o main main.o helper.o

标题:helper.c定义struct Node和方法nodeInsertisThere。为了正确使用它们,main需要它们的原型,因此提供它们的标准方法是定义helper.h标题:

#ifndef HELPER_H
#define HELPER_H /*header guard to protect against double inclusion*/
struct Node{
    struct Node* nxt;
    int x;
};
int isThere(struct Node *head, int value);
struct Node *nodeInsert(struct Node *head, int value);
#endif

并将其包含在main.c的顶部:

#include "helper.h"
//...

(您也可以将其包含在helper.c中。这应该允许编译器帮助您捕获可能的错误 不一致的情况。)

答案 2 :(得分:1)

更改您的makefile,以便引用应该在二进制文件中的所有.c文件:

all:
    gcc -o main main.c helper.c

另外,main.c中的代码需要知道helper.c中的方法声明,这就是helper.c中的代码声明和代码的函数声明应该在{{} { 1}}(或在main.h中并包含在helper.h

答案 3 :(得分:0)

我想补充@John Weldon的回答,您可以直接在helper.c中添加main.c,并将static中的函数声明为// main.c #include "helper.c" int main(void) { HelloWorld(); return 0; } // helper.c #include <stdio.h> static void HelloWorld(void) { puts("Hello World!!!"); } ,如下例所示:

gcc -o main main.c helper.c

在Makefile中,你可以编译helper.c和main.c,如:

{{1}}