Включить исходный файл в программу на C - PullRequest
2 голосов
/ 27 октября 2009

Как я могу включить функцию foo () для foo.c в эту маленькую программу (извините за мой вопрос по noob):

В моем файле foo.h:

/* foo.h */
#include <stdio.h>
#include <stdlib.h>

int foo(double largeur);

В foo.c:

/* foo.c */
#include <stdio.h>
#include <stdlib.h>
#include "foo.h"

int foo(double largeur)
{
  printf("foo");
  return 0;
}

А в main.c:

/* main.c */
#include <stdio.h>
#include <stdlib.h>
#include "foo.h"

int main(int argc, char *argv[])
{
  printf("Avant...");
  foo(2);
  printf("Apres...");
  return 0;
}

После компиляции:

$ gcc -Wall -o main main.c

Я получаю эту ошибку:

неопределенные символы: "_foo", ссылка от: _main в ccerSyBF.o ld: символ (ы) не найдены collect2: ld возвращен 1 статус выхода

Спасибо за любую помощь.

Ответы [ 4 ]

14 голосов
/ 27 октября 2009
$ gcc -Wall -o main main.c foo.c

GCC не знает, чтобы искать foo.c, если вы не скажете:)

6 голосов
/ 27 октября 2009

Создание программы на C требует двух шагов, компиляции и компоновки. Чтобы просто запустить компиляцию, используйте параметр -c для gcc:

 gcc -c main.c

Это создает объектный файл, main.o (или main.obj в Windows). Аналогично для gcc -c foo.c. Вы не получите сообщение об ошибке выше на этом этапе. Затем вы связываете эти два объектных файла вместе. На этом этапе символ foo разрешается. Причина, по которой вы получили сообщение об ошибке, была в том, что компоновщик не смог найти символ, потому что он смотрел только на main.o, а не foo.o. Компоновщик обычно запускается из gcc, поэтому для связывания ваших объектных файлов и создания окончательного исполняемого файла main используйте

 gcc -o main main.o foo.o
5 голосов
/ 27 октября 2009

Вы должны скомпилировать foo.c также потому, что это другой модуль. Позвольте мне посмотреть, как они это делают в gcc:

$ gcc -Wall main.c foo.c -o main 
1 голос
/ 27 октября 2009

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

APP_NAME = Foo
Foo_HEADERS = foo.h
Foo_FILES = main.c foo.c

Если вы не очень хорошо знакомы с MakeFiles, я предлагаю вам взглянуть на Make Docs , но это простой пример, APP_NAME задает имя скомпилированного исполняемого файла (в этом case Foo), Foo_HEADERS установит заголовки, используемые вашим приложением, Foo_FILES вы установите исходные файлы ваших приложений, не забудьте поставить APP_NAME (в данном случае Foo) в начале _HEADERS и _FILES. Я предлагаю вам использовать MakeFiles, потому что они организуют процесс сборки приложения и будут удобнее для конечного пользователя.

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