После запуска, структура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
Поскольку 'НКУ -c' компилирует только без ссылок. Предоставление файлов '* .o' бесполезно, так как предупреждение приветствуется. –
'-c' означает только компиляцию (не ссылаться). Поэтому файл '.o' не может быть предоставлен, поскольку он не может быть скомпилирован (он уже скомпилирован и должен быть связан). – kaylum
'gcc -c' предназначен для компиляции, а не для связывания. – 599644