2012-05-03 2 views
1

В настоящее время я пытаюсь скомпилировать существующий проект, представляющий собой сочетание cpp и c.Ошибка повторяющихся символов C/C++

My makefile выглядит следующим образом:

execute: mgnsvd.o multifit.o cit.o main.o 
    g++ -Wall -g multifit.o cit.o main.o mgnsvd.o -lgsl -lgslcblas -o execute 

main.o: main.cpp cit.cpp 
    g++ -Wall -g -c main.cpp 

cit.o: cit.cpp mgnsvd.c multifit.h 
    g++ -Wall -g -c cit.cpp 

multifit.o: multifit.c mgnsvd.c multifit.h 
    g++ -Wall -g -c multifit.c 

mgnsvd.o: mgnsvd.c 
    g++ -Wall -g -c mgnsvd.c 

И моя главная является довольно простой

// global libraries 
#include <iostream> 

// local files 
#include "cit.cpp" 

// using directives 
using std::endl; 
using std::cout; 

// main 
int main(){ 

    cout << "Hello, world" << endl; 

return 0; 
} 

Если закомментировать #include "cit.cpp" он отлично компилируется. Однако, если я включаю его, возникает следующая ошибка;

ld: duplicate symbol _first_function_in_cit in main.o and cit.o for architecture x86_64 

_first_function - это всегда первая функция и не определена или даже не объявлена ​​/ не используется нигде. Grep объектных файлов подтверждает, что функция, похоже, включена в main.o, но почему? Я раньше не работал над проектом C++/C, так что, возможно, я делаю каноническую ошибку? Я тоже в OSX, если это имеет значение.

Для записи нет классов - файл .h содержит несколько структур и некоторые макросы.

+3

Почему вы включаете 'cit.cpp', который я предполагаю, файл реализации? Можете ли вы показать нам этот файл? Вы можете скомпилировать файлы вместе. – birryree

ответ

4

cit.cpp компилируется сам по себе, а также входит в main.cpp так что вы получаете две копии всего кода в нем.

+0

Я вроде хочу удалить этот вопрос сейчас. Спасибо - поэтому используется для включения хотя бы чего-то в мою основную (т. Е. Заголовок). – Alex

3

Там нет необходимости для

#include "cit.cpp" 

cit.cpp составляется в виде отдельного блока, а затем связаны между собой.

С выше, включают вы получите код дважды с результатами в повторяющихся символов

2

YOu компилирует cit.cpp, чтобы получить cit.o, и вы скомпилируете его с этим #include "cit.cpp" мерцанием в вашем main.cpp. Поэтому, конечно, вы получаете повторяющиеся символы.

Смежные вопросы