Неявное описание функции - PullRequest
0 голосов
/ 27 января 2010

Я только что организовал свой код, используя заголовки, но так же, как я сделал это, я получил предупреждение, которое превратилось в ошибку при связывании.

У меня есть код (использование функции, которая находится внутри заголовка) в test.c, которая выглядит следующим образом:

#include "test1.h"

/* Some code */
main()
{
   Testing();
}

И мой test1.h заголовок выглядит так:

void Testing();
void print(int, int, int, const char*);

А на test1.c

void Testing()
{
   print(0xF9, 27, 5, "\xC9\\xBB");
}

void print(int colour, int x, int y, const char *string)
{
   volatile char *video=(volatile char*)0xB8000 + y*160 + x*2;
   while(*string != 0)
   {
      *video=*string;
      string++;
      video++;
      *video=colour;
      video++;
   }
}

Когда я пытаюсь скомпилировать код, я получаю это:

ubuntu @ eeepc: ~ / Development / Test $ gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
test.c: в функции «main»:
test.c: 11: предупреждение: неявное объявление функции «Тестирование»
ubuntu @ eeepc: ~ / Разработка / Тестирование $

В то время это просто простое предупреждение, но когда я пытаюсь связать его ...

ubuntu @ eeepc: ~ / Development / Test $ ld -T linker.ld -o kernel.bin loader.o test.o
test.o: в функции main':<br> test.c:(.text+0xfc): undefined reference to Testing '

Что мне нужно сделать?

Ответы [ 5 ]

1 голос
/ 27 января 2010

Я не могу воссоздать твою проблему. Это работает, как и ожидалось, когда я пытаюсь скомпилировать ваш код на машине с Ubuntu (которая, как я полагаю, основана на вашей вставке).

Вы уверены, что #include происходит правильно?

Попробуйте использовать -E вместо -c, чтобы увидеть, как выглядит весь код, который компилятор пытается скомпилировать.

1 голос
/ 27 января 2010

Редактировать: Чтобы отразить вопрос ОП, я вычеркнул несколько строк своего ответа, несмотря на то, что его проголосовали ...

Почему kernel.c помечен в компиляторе, даже если он здесь не упомянут? Я что-то упустил ...

gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
kernel.c: In function ‘main’:
kernel.c:11: warning: implicit declaration of function ‘Testing’
ubuntu@eeepc:~/Development/Test$

возможно, вам нужно сделать это где-нибудь в вашем заголовочном файле, так как я считаю, что вы хотите, чтобы ядро ​​получило доступ к этой функции:

extern void Testing();

И, возьмите все свои функции и поместите их в отдельный файл .c, они не должны быть там в первую очередь ... например:

Testing.c
/* all your functions here */

Testing.h
/* Only global, external variables and function prototypes */

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 26 мая 2010

Я не знаю, что вызвало это, но у меня была эта проблема только сейчас. попробуйте удалить файл .h и поместить объявления функций поверх самого файла .c.

в этом случае удалите test1.h и поместите объявления функций test1.c в test1.c. и включите test1.c в test.c вы больше не получите это предупреждающее сообщение, а также следующие ошибки компоновки.

0 голосов
/ 27 января 2010

Вы включили test.h в main.c, в то время как ваши декларации, согласно тому, что вы написали, находятся в test1.h. Обратите внимание на 1 в названии.

В дополнение к этому вы компилируете test.c и связываете test.o, тогда как на самом деле имя вашего файла - test1.c. Снова обратите внимание на 1 в названии.

Редактировать: Теперь вы отредактировали имя файла, включенного в main.c. После редактирования можно с уверенностью утверждать, что большинство описанных вами симптомов не возможно с текущими версиями файлов. Повторно проверьте, что вы делаете, опубликуйте обновленную информацию и / или опишите реальный код.

Тем не менее, строки компилятора и компоновщика ссылаются на старые имена файлов.

0 голосов
/ 27 января 2010

Здесь что-то вроде кадра в темноте, поскольку мой C немного ржавый, но позволяет ли C помещать функциональные тела в заголовок? Я не помню, что это делает. Попробуйте переместить определение Testing () и print () в файл .c? Вы также можете попробовать скомпилировать как C ++, как посмотреть, исправит ли это, если вам не нужен / хотите C.

...