2013-10-24 4 views
-4

Я пытаюсь скомпилировать некоторый код C++ на os x, используя g ++ в терминале. Однако я все время ошибаюсь, и я не уверен, что это значит. У меня 3 файла, main.cpp; comp_fns.cpp и comp_fns.h. Окно и Джин - это два разных класса. Ниже приведена ошибка:ошибка дублирования символа при компиляции кода C++

g++ -Wall main.cpp comp_fns.cpp 
duplicate symbol Window::setValues(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)in: 
    /var/folders/jf/3y93rsfd1n55q2qd75y0w0r00000gn/T//cc51aFZg.o 
    /var/folders/jf/3y93rsfd1n55q2qd75y0w0r00000gn/T//cc2KNfcB.o 
duplicate symbol Gene::setValues(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)in: 
    /var/folders/jf/3y93rsfd1n55q2qd75y0w0r00000gn/T//cc51aFZg.o 
    /var/folders/jf/3y93rsfd1n55q2qd75y0w0r00000gn/T//cc2KNfcB.o 
ld: 2 duplicate symbols for architecture x86_64 
collect2: ld returned 1 exit status 

Любая помощь была бы очень признательна, и я могу опубликовать код при необходимости. EDIT: я не # включал один файл cpp в другой. Вот мой заголовочный файл, где я думаю, что проблема может быть. Это моя первая программа cpp, поэтому могут быть некоторые очевидные ошибки. Я изначально написал его в C и меняю его на C++, поэтому я могу узнать, как это сделать.

#ifndef __Compare_Data_C____comp_fns__ 
#define __Compare_Data_C____comp_fns__ 

#include <iostream> 
#include <cstdlib> 
#include <string> 
#include <sstream> 

using namespace std; 

class Window { 
public: 
    int start, stop, length; 
    double average; 
    string strandID, locations; 
    void setValues(string locs, string strand, string length, string avg); 
}; 

class Gene { 
public: 
    int start, stop; 
    string strandID, genes; 
    void setValues(string locs, string strand, string spcGene); 
}; 


void Window::setValues(string locs, string strand, string a_length, string avg) { 
    locations = locs; 
    vector<string> token(3); 
    istringstream iss(locs); 
    for (int i=0; i<3; i++) { 
     getline(iss, token[i], '.'); 
    } 
    start = atoi(token[0].c_str()); 
    stop = atoi(token[2].c_str()); 
    strandID = strand; 
    length = atoi(a_length.c_str()); 
    average = atof(avg.c_str()); 
} 

void Gene::setValues(string locs, string strand, string givenGene) { 
    vector<string> token(3); 
    istringstream iss(locs); 
    for (int i=0; i<3; i++) { 
     getline(iss, token[i], '.'); 
    } 
    start = atoi(token[0].c_str()); 
    stop = atoi(token[2].c_str()); 
    strandID = strand; 
    genes = givenGene; 
} 

int getSize(string inputID, string strandID, const int header); 
void getWindows(vector<Window> &win, string inputID, const int header); 
void getGenes(vector<Gene> &posGene, vector<Gene> &negGene, string inputID, const int header); 
void getSpecialWindows(vector<Window> &w, vector<Gene> &g, int wSize, int gSize, ofstream &output); 

#endif /* defined(__Compare_Data_C____comp_fns__) */ 
+7

да, введите код –

+1

Вы включаете один файл cpp в другой? Плохо, плохо! – littleadv

+0

Это не проблема, но имена, содержащие два последовательных символа подчеркивания ('__Compare_Data_C ____ comp_fns__') и имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы для реализации. не используйте их. –

ответ

6

Повторяющиеся символы означает, что компоновщик сталкивается с же функцию в обоих ваших компиляции (main.cpp и comp_fns.cpp). Возможно, вы реализовали функции в заголовке без inline?

+0

Я добавил свой заголовочный файл. Я не думал, что мне нужно использовать inline для объявления функции setValues. Это неверно? Благодарю. –

+0

Поместите определения функций setValues ​​внутри .cpp-файла. Вы можете использовать 'inline', но это не является хорошей практикой для таких больших функций, но только для простых методов, таких как геттеры/сеттеры или классы шаблонов. – Marius

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