2017-02-05 38 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