2017-02-05 5 views
1

Я пытаюсь скомпилировать мою программу на C, и я получаю некоторые странные ошибки компиляции, и я понятия не имею, откуда она. Я уже нашел похожие сообщения, но их решение указать выход с -o не работает.Ошибка компиляции с ошибками как «множественное определение»

SO это как мой 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

К сожалению, это не проблема ... 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, и теперь единственные ошибки, которые я получаю, - от этих! SO Я получаю сообщение об ошибке, например, lib.h "undefined reference to rev". И затем я проверил заголовок и файлы C, и это выглядело так, как вы только что предложили в качестве решения. поэтому с 'extern const int rev;' в этом заголовке и 'const int rev = 100;' в файле lib.c. Так разве это не так, если мой компилятор тут же жалуется? – malajedala

+0

@malajedala Я думаю, вам нужно скомпилировать библиотеку, которую вы используете из github, а также связать ее с вашей программой. – Winestone

-1

Вполне вероятно, что проблема вызвана отсутствием защитных устройств #include.

Чтобы предотвратить файл от того, включены более чем один раз

#ifndef myheader_h 
#define myheader_h 

#define DISTANCE_MAX 1000 

#endif 
+0

Это не имеет никакого смысла. – melpomene