对函数'的未定义引用

时间:2016-06-30 22:28:16

标签: c linker-errors undefined-reference

由于某种原因,程序给了我这个错误

undefined reference to createNetworkDriver

现在我的文件夹结构是:

mini-kernel/
            kernel/
                   drivers/
                           network/
                                   network.h
                                   network.c
           util/
                errors/
                       errors.c
           main.c

network.h:

#ifndef _network_h_
#define _network_h_
#pragma once

#include <stdbool.h>
#include<stdint.h>

typedef struct
{
    char *name;
    bool initalized;
    int32_t status;
    int (*initalize)(void);
}NetworkDriver;

NetworkDriver* createNetworkDriver(void);
NetworkDriver* destroyNetworkDriver(NetworkDriver *self);
#endif

network.c:

#include "network.h"
#include "../../../util/errors/errors.c"

extern void die(const char *message);

NetworkDriver* createNetworkDriver(void)
{
    printf("Working");
    NetworkDriver nd = malloc(sizeof(NetworkDriver));
}

NetworkDriver* destroyNetworkDriver(NetworkDriver *self)
{
    if(self->initalized == true)
        free(self);
    else
        die("NET_DRIVER FAILED TO DESTROY");

}

errors.c:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

void die(const char *message)
{
    if(errno) {
        perror(message);
    } else {
        printf("ERROR: %s\n", message);
    }

    exit(1);
}

最后我的main.c:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "kernel/drivers/network/network.h"


int main(int argc, char *argv[])
{
    NetworkDriver *nd = createNetworkDriver();
}

由于某些原因,当我运行main.c文件gcc main.c -std=c99 -w -lm时,我收到错误:undefined reference to createNetworkDriver

我目前正在线上编程here

1 个答案:

答案 0 :(得分:3)

您需要使用所有源文件进行构建。仅包含头文件不足以让编译器和链接器知道您真正需要哪些文件。

所以做这样的事情:

$ gcc main.c util/errors/errors.c kernel/drivers/network/network.c -std=c99 -o my_kernel -w -lm

这会将每个源文件构建到(临时)目标文件中,并将所有目标文件链接到一个名为my_kernel的可执行文件中(使用-o选项指定)。