C - Неопределенная ссылка на ошибку функции со связанными файлами

Я начал реализовывать большую программу. Но я столкнулся с серьезной проблемой. Итак, вот очень упрощенный код моей программы. У меня есть отдельный файл .c для моих функций, который называется normal.c, основная программа — main.c, и я связал эти два файла с cal.h< /strong> заголовочный файл.

main.c

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

void main()
{
    int num1, num2, ans;
    num1=5;
    num2=5;
    ans=add(num1, num2);
    printf("%d" ,ans);
}

нормальный.с

#include "cal.h"

int add(int num1, int num2)
{
    return num1+num2;
}

кал.ч

#ifndef CAL_H_INCLUDED
#define CAL_H_INCLUDED
#include <errno.h>

int add(int num1, int num2);

#endif // CAL_H_INCLUDED

но когда я это компилирую, выдает ошибку ..\main.c|10|неопределенная ссылка на `add'|

Я использую CodeBlocks v.13.12 в Windows 8.1. Любой ответ на этот вопрос очень ценится. Я также пробовал с CodeLite, но возникает та же ошибка. Благодарю вас!


person Dinuka Lankaloka    schedule 11.07.2014    source источник
comment
Когда вы связываете файлы, вы включаете normal.o?   -  person Barmar    schedule 11.07.2014
comment
Нет, я этого не сделал. И мне очень жаль, так как я новичок в C, я понятия не имею о работе с .o файлами. Объяснение было бы большим подспорьем!   -  person Dinuka Lankaloka    schedule 11.07.2014
comment
Я не могу говорить о том, как работает CodeBlocks, но вот как обычно работает компиляция C. Каждый файл .c отдельно компилируется в файл .o (объектный файл). Таким образом, ваш main.c будет скомпилирован в main.o, а normal.c будет скомпилирован в normal.o. Ни один из них не является исполняемым и не является полной программой. Затем два объектных файла связываются вместе. Linked в данном случае является техническим термином, в отличие от вашего использования — это шаг, выполняемый компоновщиком. Компоновщик генерирует ваш фактический исполняемый файл. Как правило, IDE автоматически связывают любые файлы .c в одном проекте.   -  person EvanED    schedule 11.07.2014
comment
Да, я понял, но, похоже, эти два файла не были связаны. В противном случае add не может быть неопределенным. Любые предложения, чтобы исправить это?   -  person Dinuka Lankaloka    schedule 11.07.2014


Ответы (3)


Полная компиляция кода требуется в терминале ubuntu, используйте следующее

gcc normal.c main.c -o out -lm
person kubuntu    schedule 17.02.2016

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

У меня была такая же проблема, когда я создавал отдельные файлы .c и .h и ожидал, что IDE свяжет объектные файлы, но это не удалось. Я поставил их под проект, и это сработало!

person Nish    schedule 03.02.2015

Используйте полную компиляцию вашего кода. если ваши кодовые файлы c main.c и normal.c находятся в ./src, а заголовочный файл cal.h находится в ./inc, следуйте приведенному ниже методу из текущего каталога (.)

g++ ./src/main.c ./src/normal.c -I ./inc -o main

теперь main отсутствует двоичный файл для выполнения.

person Gowthaman15    schedule 04.03.2015