2016-12-20 5 views
0

После запуска, структураLinker ошибка - неопределенная ссылка -gcc

Cygwin-PC ~/code_practice/Computing/list 
    $ gcc -c arrayImpl.c -o arrayImpl.o 

код каталога, в окнах (Cygwin)

Cygwin-PC ~/code_practice/Computing/stack 
$ ls 
main.c stack.h stackImpl.c 

Cygwin-PC ~/code_practice/Computing/list 
$ ls 
arrayImpl.c arrayImpl.o linkedListImpl.c list.h main.c 

Stack абстракции зависит от List абстракции, для представления данных & Применение.

List абстракция, как показано ниже,

/************ list.h ************/ 


/***************** Usage-start ************/ 
typedef enum{false, true}bool; 
typedef enum {CREATE_NEW_LIST, DOUBLE_THE_LIST, HALF_THE_LIST}Op; 

#if defined(ARRAY) 

    /* To ensure Encapsulation(i.e., maintain invariants of array) */ 
    typedef struct List List; 

#elif defined(LINKED_LIST) 

    /* To ensure Encapsulation(i.e., maintain invariants of linked list) */ 
    /* User will not get access to node*/ 
    typedef struct List List; 


#else 
    #error "Wrong list implementation macro name !!!" 
#endif 


void insertItem(List *, void *newItem); 
void *deleteItem(List *, int listIndex); 
void *deleteLastItem(List *); 


List* createList(List *, Op opType); 

/***************** Usage-end ***************/ 

/***************** arrayImple.c **************/ 

#if defined(ARRAY) 

#include"list.h" 


/************ Representation - start ************/ 
typedef struct List{ 
    void **array; 

    /* Following members for Housekeeping - Array enhancement*/ 
    int lastItemPosition; 
    int size; 
}List; 

#define INITIAL_LIST_SIZE 50 
/********************* Representation - end ************/ 




/************* Usage - start ***************/ 
List *createList(List *list, Op opType){ 

     .... 
} 

void insertItem(List *arrayList, void *newItem){ 
      ... 
} 

void *deleteItem(List *arrayList, int listIndex){ 
    .... 
} 

void * deleteLastItem(List *arrayList){ 
    ... 
} 
/******************** Usage - end *******************/ 

#endif 

Stack абстракция, как показано ниже,

/********* stack.h *********/ 

#include"../list/list.h" 

typedef struct Stack Stack; 

Stack *createStack(); 
void push(Stack *, void *item); 
void*pop(Stack *); 

/*********** stackImpl.c *******/ 

#include"../list/list.h" 

typedef struct Stack{ 
    List *stack; 
}Stack; 

Stack* createStack(){ 

    Stack *s = malloc(sizeof(Stack)); 
    s->stack = createList((void *)0, CREATE_NEW_LIST); 

    return s; 
} 

void push(Stack *s, void *item){ 
    insertItem(s->stack, item); 
} 

void *pop(Stack *s){ 
    void *item = deleteLastItem(s->stack); 
    return item; 
} 

Ниже компиляции говорит, с учетом ниже сообщения, которое не включает в себя линкер,

Cygwin-PC ~/code_practice/Computing/stack 
    $ gcc -c -DARRAY main.c stackImpl.c ../list/arrayImpl.o 
gcc: warning: ../list/arrayImpl.o: linker input file unused because linking 
     not done 

Ниже компиляции выходит из строя, с учетом ниже ошибки,

Cygwin-PC ~/code_practice/Computing/stack 
    $ gcc -DARRAY main.c stackImpl.c ../list/arrayImpl.o 
/tmp/ccapgYQI.o:stackImpl.c:(.text+0x25): undefined reference to 
    `createList' 
/tmp/ccapgYQI.o:stackImpl.c:(.text+0x4b): undefined reference to 
    `insertItem' 
/tmp/ccapgYQI.o:stackImpl.c:(.text+0x61): undefined reference to 
    `deleteLastItem' 
collect2: error: ld returned 1 exit status 

Вопрос,

Сверху компиляционная команда, почему GNU linker ()) не принимает ../list/arrayImpl.o файл, чтобы найти определения createList(), insertItem() & deleteLastItem()

Ниже компиляции работает,

Cygwin-PC ~/code_practice/Computing/stack 
    $ gcc -DARRAY main.c stackImpl.c ../list/arrayImpl.c 
+0

Поскольку 'НКУ -c' компилирует только без ссылок. Предоставление файлов '* .o' бесполезно, так как предупреждение приветствуется. –

+0

'-c' означает только компиляцию (не ссылаться). Поэтому файл '.o' не может быть предоставлен, поскольку он не может быть скомпилирован (он уже скомпилирован и должен быть связан). – kaylum

+0

'gcc -c' предназначен для компиляции, а не для связывания. – 599644

ответ

1

gcc -c arrayImpl.c -o arrayImpl.o

Это отсутствует -DARRAY. Без этого кода в arrayImpl.c условно удалены:

/***************** arrayImple.c **************/ 

#if defined(ARRAY) 
+0

Извините, я забыл. – overexchange

0

это

Cygwin-PC ~/code_practice/Computing/stack 
    $ gcc -DARRAY main.c stackImpl.c ../list/arrayImpl.o 
/tmp/ccapgYQI.o:stackImpl.c:(.text+0x25): undefined reference to 
    `createList' 
/tmp/ccapgYQI.o:stackImpl.c:(.text+0x4b): undefined reference to 

не удалось, потому что вы пропустили от arrayImpl.c

kaylum имеет правильный ответ, когда вы скомпилированный arrayImpl.c вы забыли -DARRAY

+0

Но компоновщик принимает файлы 'arrayImpl.o' для правильной ссылки? – overexchange

+0

Кажется, нет, почему бы просто не поместить arrayImpl.c – pm100

+0

Я использовал компоновщик, чтобы связать 'main.c' с несколькими' .o' файлами в прошлом. Если 'gcc' фактически запускает' ld' после предварительной обработки ('cpp'), компиляция (' cc') и сборка ('as'), делает ли' gcc' значение '.o' или' .c' для ссылки? Вот почему я дал '../ list/arrayImpl.o' – overexchange