Почему CC не видит мое определение функции в заголовке? - PullRequest
1 голос
/ 16 октября 2010

Я пишу простое приложение в ANSI C. Я использую GCC в среде Unix.

У меня есть следующий пример приложения:

    //main.c

#include "foo.h"

int main()
{

int result;

result = add(1,5);

return0;
}

Заголовок:

  //foo.h
    #ifndef FOO_H_INCLUDED
    #define FF_H_INCLUDED

    int add(int a, int b);

    #endif

Реализация:

//foo.c

int add(int a, int b)
{
return a+b;
}

Я компилирую свою программу с помощью следующей команды:

 cc main.c -o main.o

Компилятор жалуется, что «ссылка на add не определена». Это проблема со связыванием? Как правильно использовать мой заголовок?

Спасибо!

Ответы [ 4 ]

6 голосов
/ 16 октября 2010

Вам нужно скомпилировать оба ваших исходных файла вместе:

cc main.c foo.c -o main

Кроме того, в этом случае -o создает исполняемый файл, поэтому его вызов main.o может ввести в заблуждение.


Еще один лакомый кусочек, хотя и не связанный с вопросом: #ifndef и #define в foo.h не совпадают.

1 голос
/ 16 октября 2010

Заголовок не является вашей текущей проблемой. Ваша текущая проблема заключается в том, что вы не компилируете определение функции add в foo.c.

Попробуйте

cc main.c foo.c -o main.o
0 голосов
/ 16 октября 2010

"неопределенная ссылка" - это ошибка компоновщика , а не ошибка компилятора.

Компилятор видит объявление в заголовке, но вы не скомпилировали или не связали определение в файле foo.c.Ваш заголовок использует термин определение неправильно.

0 голосов
/ 16 октября 2010

Если вы пытаетесь скомпилировать main.c в собранный объектный файл, вам нужно запретить gcc попытки связать.Это делается с помощью

cc -c main.c -o main.o

. Вы можете скомпилировать все другие объектные файлы, затем, когда у вас есть все ваши объектные файлы, вы просто делаете

cc main.o obj1.o anotherOBJ.o -o myExecutableBinary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...