2016-06-30 4 views
1

По какой-то причине программа дает мне эту ошибкунеопределенная ссылка на `функции»

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.

Im в настоящее время программирует этот онлайн here.

+3

Вы должны строить со всеми исходными файлами. –

+0

В вашей сети.h #include не хватает места после включения и, вероятно, это почему он не включен и не скомпилирован? –

+0

Извините @JoachimPileborg im a newb здесь. Что ты имеешь в виду? – amanuel2

ответ

3

Вам необходимо построить с все исходные файлы. Просто, включая заголовочный файл, недостаточно для компилятора и компоновщика, чтобы узнать, какие файлы вам действительно нужны.

Так что-то вроде этого, вместо:

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

Это будет строить каждый исходный файл в (временный) объектный файл и связать все объектные файлы вместе в один исполняемый файл с именем my_kernel (задается с помощью -o опция).

+0

О, хорошо. Большое спасибо! Nvm знал об этом .. Кстати, почему использование Makefile является лучшим! Потому что есть тонн файлов C! Но есть ли альтернатива, кроме перечисления всех файлов C? – amanuel2

+1

@Dsafds Не имеет значения, используете ли вы make-файлы или cmake или какую-либо IDE или что-то еще, рано или поздно вам нужно будет перечислить все исходные файлы в той или иной форме. –

+0

@JoachimPileborg: Да, но иногда «список» может быть чем-то вроде '* .c'. –

Смежные вопросы