Как работает gcc linker, включая файлы - PullRequest
2 голосов
/ 24 сентября 2011

Это действительно вопрос новичка. Я учу C, и я не понимаю, как связать вместе разные файлы.

У меня есть заголовок как

/* file2.h */

int increment(int x);

и файл C

/* file2.c */

#include "file2.h"

int increment(int x)
{
    return x+1;
}

Теперь я хочу включить заголовок в file1.c, чтобы использовать функцию increment. Из того, что я понял, я должен сделать что-то вроде:

/* file1.c*/

#include "file2.h"

int main()
{
    int y = increment(1);
    return 0;
}

Но когда я пытаюсь скомпилировать все, используя

gcc -o program file1.c

Я получаю сообщение об ошибке типа

/tmp/ccDdiWyO.o: In function `main':
file1.c:(.text+0xe): undefined reference to `increment'
collect2: ld returned 1 exit status

Однако, если я включу также file2.c

/* file1.c*/

#include "file2.h"
#include "file2.c"  /* <--- here it is! */

int main()
{
    int y = increment(1);
    return 0;
}

Все работает как положено.

Но если я понял, должен быть включен только заголовочный файл (только с объявлениями в нем). Так как я могу сообщить gcc, что определение функции increment, объявленное в file2.h, содержится в file2.c?

Ответы [ 2 ]

7 голосов
/ 24 сентября 2011

Самый простой способ - скомпилировать их оба напрямую:

$ gcc -o program file1.c file2.c

Но для более сложных систем вы можете сделать это пошагово. Вот простой рецепт командной строки:

$ gcc -c file1.c
$ gcc -c file2.c
$ gcc -o program file1.o file2.o

Еще лучше для чего-то такого сложного было бы использовать make .

Помимо вашей конкретной проблемы, почему вы используете GCC? Вы можете использовать clang и получать более качественные сообщения об ошибках, более быструю компиляцию и чувствовать, что вы живете в будущем!

2 голосов
/ 24 сентября 2011

gcc -o программа file2.c file1.c

это скомпилирует file1.c и file2.c и свяжет их вместе.

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