Ошибка неопределенных символов при использовании файла заголовка - PullRequest
7 голосов
/ 04 июня 2010

Я получаю следующую ошибку и никак не могу понять, что я делаю неправильно.

$ gcc main.c -o main

Undefined symbols:
  "_wtf", referenced from:
      _main in ccu2Qr2V.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

main.c:

#include <stdio.h>
#include "wtf.h"

main(){
    wtf();
}

wtf.h:

void wtf();

wtf.c:

void wtf(){
    printf("I never see the light of day.");
}

Теперь, если я включу в заголовочный файл всю функцию, а не только сигнатуру, она будет соответствовать требованиям, поэтому я знаю, что файл wtf.h включен. Почему компилятор не видит wtf.c? Или я что-то упустил?

Привет.

Ответы [ 2 ]

12 голосов
/ 04 июня 2010

Вам необходимо связать wtf с вашим main. Самый простой способ собрать его вместе - gcc свяжет их для вас, например так:

gcc main.c wtf.c -o main

Более длинный путь (отдельная компиляция wtf):

gcc -c wtf.c
gcc main.c wtf.o -o main

Еще дольше (отдельная компиляция и компоновка)

gcc -c wtf.c
gcc -c main.c
gcc main.o wtf.o -o main

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

4 голосов
/ 04 июня 2010

Вам не хватает того факта, что простое включение заголовка ничего не говорит компилятору о том, где находится фактическая реализация (определения) вещей, объявленных в заголовке.

Они могут находиться в файле C рядом с файлом, выполняющим включение, они могут быть из предварительно скомпилированной библиотеки статических ссылок или из динамической библиотеки, загружаемой системным компоновщиком при чтении вашего исполняемого файла, или они могут появляться при запуске явная динамическая загрузка, управляемая программистом (например, семейство функций <a href="http://www.opengroup.org/onlinepubs/009695399/functions/dlopen.html" rel="nofollow noreferrer">dlopen()</a> в Linux).

C не похож на Java, не существует неявного правила, что просто потому, что файл C включает в себя определенный заголовок, компилятор должен также сделать что-то, чтобы «волшебным образом» найти реализацию вещей, объявленных в заголовке. Вы должны сказать это.

...