Я пытаюсь скомпилировать свою программу на C с помощью make, и я столкнулся с этой проблемой, которую я не могу понять. У меня есть 3 файла в папке «calc» моего проекта: add.c sub.c и main.c. У меня есть файл Makefile, расположенный в корневой папке моего проекта, в котором есть папка calc, о которой я упоминал. Это то, что мой Makefile выглядит следующим образом:C - множественное определение с makefile
CC=gcc
OBJECTS=obj/main.o obj/add.o obj/sub.o
elf/new: ${OBJECTS}
${CC} -o elf/new ${OBJECTS}
obj/main.o: calc/main.c
${CC} -c -g calc/main.c -o obj/main.o
obj/add.o: calc/add.c
${CC} -c -g calc/add.c -o obj/add.o
obj/sub.o: calc/sub.c
${CC} -c -g calc/sub.c -o obj/sub.o
clean:
rm obj/${OBJECTS} elf/new
Когда я типа «сделать» в терминал для компиляции, я получаю сообщение об ошибке, как это:
gcc -c -g calc/add.c -o obj/add.o
gcc -c -g calc/sub.c -o obj/sub.o
gcc -o elf/new obj/main.o obj/add.o obj/sub.o
obj/add.o: In function `add':
/home/bigger/workspace/test/calc/add.c:1: multiple definition of `add'
obj/main.o:/home/bigger/workspace/test/calc/add.c:1: first defined here
obj/sub.o: In function `sub':
/home/bigger/workspace/test/calc/sub.c:1: multiple definition of `sub'
obj/main.o:/home/bigger/workspace/test/calc/sub.c:1: first defined here
collect2: error: ld returned 1 exit status
makefile:5: recipe for target 'elf/new' failed
make: *** [elf/new] Error 1
И мой код есть:
[email protected]:~/workspace/test> cat calc/add.c
int add(int a, int b){
return a+b;
}
[email protected]:~/workspace/test> cat calc/sub.c
int sub(int a, int b) {
return a-b;
}
[email protected]:~/workspace/test> cat calc/main.c
#include <stdio.h>
#include "add.c"
#include "sub.c"
int main(int argc, char* argv[])
{
int a = 10;
int b = 5;
printf("add: %d\nsub:%d\n", a+b, a-b);
return 0;
}
Включить заголовочные файлы, а не c-файлы. – tkausl
Я переименовал файлы add/sub.c, чтобы добавить/sub.h. И еще одна ошибка: obj/add.o: файл не распознан: формат файла не распознан –
Не переименовывайте c-файлы в h-файлы, пишите _additional_ h-files _ только с объявлениями, а не с определениями_. – tkausl