2015-09-28 2 views
0

Использование файлов заголовков таким образом дает мне ошибку «неопределенная ссылка на somefunc». Каков правильный способ убедиться, что somefunc.c видно, чтобы эта ошибка не возникала? Кажется, просто включая somefile.h в main.c не достаточно, чтобы увидеть определения в somefile.cКак организовать файлы заголовков

main.c

#include "somefile.h" 
int main() { 
    somefunc(); 
return 0; 
} 

somefile.h

#ifndef SOMEFILE_H 
#define SOMEFILE_H 

void somefunc(); 

#endif 

somefile.c

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

void somefunc() { 
    printf("hello\n"); 
} 

Я не понимаю, почему я получаю ошибки, потому что это тот же способ, которым они используются в учебниках и видео, которые я просматривал, ища ответ. Приведенный выше код является ответом, данным ранее, но он по-прежнему имеет ту же ошибку.

+0

Возможный дубликат [Правильное использование файлов заголовков] (http://stackoverflow.com/questions/32813896/proper-use-of-header-files) – Olaf

+0

Да, я спросил это раньше в псевдокоде и получил нерелевантные ответы, поэтому Я переделал его с фактическим кодом, чтобы сделать его более понятным. – Rhurac

+0

И вы не могли бы отредактировать этот вопрос - почему? – Olaf

ответ

3

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

Это означает, что, хотя при компиляции main.c заголовок somefile.h найден, вы не компиляции файла somefile.c вместе с main.c. Поэтому, когда происходит связывание, компоновщик не может найти реализацию somefunc в любом объектном файле для разрешения вызова с main().

Если вы используете GCC или Clang просто скомпилировать как исходные файлы в вашей команде, например

gcc somefunc.c main.c -o output 

Если вы используете IDE вместо этого, убедитесь, что somefile.c собран вместе с main.c при создании приложения.

+0

Спасибо, что так много уже часами болит у меня. Именно то, что я искал. Есть ли способ различать ошибки компоновщика и ошибки компилятора? – Rhurac

+0

Как правило, ошибки компилятора ссылаются на источник с номером строки, ошибки компоновщика обычно жалуются на контрольную «неопределенную ссылку», не указывая на исходный код (кроме указания того, какой модуль сделал вызов отсутствующей функции – JVene

2

Это не похоже на проблему с файлом заголовка.

Это, как представляется, является проблемой при связывании, которая зависит от того, как вы строите проект. Если вы используете IDE, это означает, что somefile.c не включен в проект. Если вы используете make и make-файл, это означает, что somefile.c не указан в make-файле или, по крайней мере, не включен для компоновщика. Если вы строите в командной строке (не используя make или какой-либо инструмент сборки, а используя gcc), вы не включаете somefile.c в команду.

Неопределенная эталонная ошибка означает, что компоновщик не смог найти код в файле somefile.c, потому что компоновщик не знал, чтобы включить его.

Смежные вопросы