2016-10-08 3 views
1

Я пытаюсь скомпилировать свою программу на 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; 
} 
+1

Включить заголовочные файлы, а не c-файлы. – tkausl

+0

Я переименовал файлы add/sub.c, чтобы добавить/sub.h. И еще одна ошибка: obj/add.o: файл не распознан: формат файла не распознан –

+0

Не переименовывайте c-файлы в h-файлы, пишите _additional_ h-files _ только с объявлениями, а не с определениями_. – tkausl

ответ

1

Когда вы включаете его, добавляете функции и добавочную часть вашего main.c, тогда, когда вы делаете, вы связываете main (который уже имеет функции включением) в объекты add и sub, которые имеют одинаковую функцию символы. Вам нужно включить заголовочные файлы с объявлениями функций, а не включать определения функций. См. http://www.cprogramming.com/declare_vs_define.html для более продолжительного обсуждения.

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