C - 使用makefile

时间:2016-10-08 12:55:42

标签: c makefile

我正在尝试使用make编译我的C程序,并且我遇到了这个我无法理解的问题。我在' calc'中有3个文件。我项目的文件夹:add.c sub.c和main.c.我的Makefile位于我项目的根文件夹中,该文件夹中包含我在其中提到的calc文件夹。这就是我的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

当我输入' make'进入终端进行编译,我收到如下错误:

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

我的代码在那里:

bigger@linux:~/workspace/test> cat calc/add.c 
int add(int a, int b){
    return a+b;
}


bigger@linux:~/workspace/test> cat calc/sub.c 
int sub(int a, int b) {
    return a-b;
}


bigger@linux:~/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 个答案:

答案 0 :(得分:1)

当你包含它时,正在使main.c的函数添加和子部分,然后当你将main(已经有include的函数)链接到具有相同函数符号的add和sub对象时。您需要包含带有函数声明的头文件,而不是包含函数定义。有关详细讨论,请参阅http://www.cprogramming.com/declare_vs_define.html