我正在尝试编译我的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 :(得分:1)
在头文件中,您应该声明您的变量:
extern const int khStrInt;
然后在.c文件中,您应该将其定义为:
const int khStrInt = 33;
这意味着变量定义仅在编译.c文件时由编译器生成一次,因此链接器不会看到多个定义。此外,在头文件中使用声明允许包含头的其他文件能够使用该变量。
答案 1 :(得分:-1)
很可能这个问题是由缺少#include警卫造成的。
防止文件被多次包含
#ifndef myheader_h
#define myheader_h
#define DISTANCE_MAX 1000
#endif