2017-02-05 56 views
1

錯誤我試圖編譯我的C程序,我收到一些奇怪的編譯錯誤,我不知道它是從哪裏過來。我已經發現了類似的帖子,但是他們用-o指定輸出的解決方案不起作用。編譯錯誤中包含「多重定義」

所以這是我的makefile怎麼樣子(縮短了):

CC = gcc -O3 -Wextra -Wall -pg -g -std=c99 

OBJ = ./src/main.o ./src/FUNC.o ./src/getRoot.o ./src/getTree.o 

out: $(OBJ) 
    g++ -std=c99 -g -o ./myProgramm $(OBJ) 


./src/FUNC.o: src/FUNC.c 
    $(CC) -c src/FUNC.c -o ./src/FUNC.o 

./src/main.o: src/main.c 
    $(CC) -c src/main.c -o ./src/main.o 

./src/getRoot.o: src/getRoot.c 
    $(CC) -c src/getRoot.c -o ./src/getRoot.o 

./src/getTree.o: src/getTree.c 
    $(CC) -c src/getTree.c -o ./src/getTree.o 

這是錯誤我得到的一部分:

./src/FUNC.o:(.rodata+0x78): multiple definition of `khStrInt' 
./src/main.o:(.rodata+0x0): first defined here 
./src/FUNC.o: In function `get_nbr_edge_kmer': 
/home/Documents/EXAMPLE_CODE/src/FUNC.c:126: multiple definition of `DISTANCE_MAX' 
./src/main.o:(.rodata+0x4): first defined here 
./src/getRoot.o:(.rodata+0x0): multiple definition of `DISTANCE_MAX' 
./src/main.o:(.rodata+0x4): first defined here 
./src/main.o:(.rodata+0x4): first defined here 
./src/getTree.o:(.rodata+0x0): multiple definition of `DISTANCE_MAX' 
./src/main.o:(.rodata+0x4): first defined here 
./src/getRoot.o:(.rodata+0x0): multiple definition of `khStrInt' 

是否有人也許有一些想法是我我在這裏做錯了:/

+0

擁有源代碼是有用的,你可能有功能'khStrInt'在頭文件中定義(定義意味着它有一個機構),並有頭文件'include'd在多個'.c'文件中。這意味着編譯會多次生成'khStrInt'的代碼,所以你會得到多個定義錯誤。類似的事情適用於您的其他多重定義。只需在頭文件中聲明函數並在'.c'文件中定義函數體即可解決此問題。 – Winestone

+0

Unforunately,這是沒有問題...... khStrInt僅僅是一個常數'const int的khStrInt = 33'在getRoot.h定義,然後將其他文件都包括這個頭文件來使用它。 – malajedala

+0

是的,我正在構建正如你所建議的代碼,所以在頭寫的函數原型,然後定義在C文件中的函數體,然後包括在C文件的頭,我需要他們 – malajedala

回答

1

在你的頭文件中,你應該聲明你的變量,如:

extern const int khStrInt; 

然後在.c文件,你應該把它定義喜歡:

const int khStrInt = 33; 

這意味着編譯.c文件,並因此鏈接不看的時候變量定義,只能由編譯器產生的一次多重定義。另外,在頭文件中聲明允許包含頭文件的其他文件能夠使用該變量。

+0

@melpomene對不起,犯了這個錯誤,感謝編輯。 – Winestone

+0

有趣的是,你提到..我只是設法減少這個問題,所以我使用了一些C庫,我從github中獲得了,現在唯一的錯誤就是來自這些問題! 因此,我得到一個像lib.h「undefined引用rev」的錯誤。然後我檢查了頭文件和C文件,它看起來像你剛剛提出的解決方案。所以在lib.c文件中使用'extern const int rev;'和'const int rev = 100;'。如果我的編譯器在這裏抱怨,那麼這不是錯誤嗎? – malajedala

+0

@malajedala我認爲你需要編譯你在github中使用的庫,並且將它與你的程序鏈接起來。 – Winestone

-1

很可能帶來的問題就是缺乏的#include警衛造成的。

爲了防止文件被包含不止一次

#ifndef myheader_h 
#define myheader_h 

#define DISTANCE_MAX 1000 

#endif 
+0

這沒有任何意義。 – melpomene