Ошибка при компиляции с GCC - PullRequest
1 голос
/ 14 августа 2011

Каждый раз, когда я компилирую, я получаю следующее сообщение об ошибке:

Undefined reference to ( function name )

Допустим, у меня есть три файла: Main.c, printhello.h, printhello.c.Main.c вызывает функцию print_hello(), которая возвращает «Hello World».Функция определена в printhello.c.

Теперь вот следующий код printhello.h:

#ifndef PRINTHELLO_H 
#define PRINTHELLO_H

void print_hello();

#endif

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

Ответы [ 4 ]

3 голосов
/ 14 августа 2011

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

Вам нужно скомпилировать программу так:

gcc -o printhello Main.c printhello.c

Предполагается, что ваш файл Main.c выглядит примерно так:

#include "printhello.h"

int main(void)
{
    print_hello();
    return 0;
}

и что ваш файл printhello.c выглядит примерно так:

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

void print_hello(void)
{
    puts("Hello World");
}

Ваша декларация в printhello.h должна быть:

void print_hello(void);

Это явно говорит о том, что функция не принимает параметров. Объявление с пустыми скобками означает «есть функция print_hello(), которая не возвращает значения и принимает неопределенный (но не переменный) список аргументов», что совершенно иное. В частности, вы можете вызвать print_hello() с любым количеством аргументов, и компилятор не сможет отклонить программу.

Обратите внимание, что C ++ обрабатывает пустой список аргументов так же, как void print_hello(void); (поэтому он гарантирует, что вызовы print_hello() не содержат аргументов), но C ++ не совпадает с C.

3 голосов
/ 14 августа 2011

Неопределенные ссылки - ошибки компоновщика.Вы компилируете и связываете все исходные файлы?Поскольку main.c вызывает print_hello(), компоновщик должен увидеть его определение.

gcc Main.c printhello.c -o a.out
0 голосов
/ 14 августа 2011

Кажется, что ошибка от компоновщика, а не компилятора.Вам необходимо скомпилировать и связать оба исходных файла.Я думаю, что вы делаете, просто включаете заголовочный файл в Main.c, и вы не компилируете printhello.c

Вам необходимо:

gcc Main.c printhello.c -o myprog

или

сначала создайте объектные файлы

gcc -c printhello.c
gcc -c Main.c

, а затем свяжите их

gcc Main.o printhello.o
0 голосов
/ 14 августа 2011

Другой способ сделать это - явно создать объектные файлы для printhello:

gcc -c printhello.c -o printhello.o
gcc -o Main main.c printhello.o

Это дает дополнительное преимущество, позволяя другим программам использовать метод print_hello

...