2016-10-08 22 views
1

makeを使って私のCプログラムをコンパイルしようとしていますが、この問題をよく理解できません。私は私のプロジェクトの 'calc'フォルダに3つのファイルを持っています: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ファイル_を_宣言のみで記述します。 – tkausl

答えて

1

main.cの関数の追加とサブ部分をインクルードすると、同じ機能を持つaddオブジェクトとsubオブジェクトにmain(既に関数を含む)がリンクされているときにシンボル。関数定義を含めるのではなく、関数宣言でヘッダーファイルをインクルードする必要があります。詳細は、http://www.cprogramming.com/declare_vs_define.htmlを参照してください。