Ошибка компоновщика множественное определение конструктора класса - PullRequest
0 голосов
/ 16 марта 2012

решить

Мне пришлось удалить старые объектные файлы и перестроить весь проект, чтобы решить проблему. К сожалению, я не знаю причину, по которой я получил эту ошибку.

Может быть, это где-то неправильно размещенные операторы include или, возможно, были определения в объявлении класса accountsContainer.h, которое я тем временем удалил.

Я пытаюсь скомпилировать небольшое приложение на C / C ++, и у меня возникла проблема со связыванием:

точная ошибка такова:

make all 
g++ -g -Wall -fmessage-length=0 -I "Z:/SRS/Verwaltung/EDV/Marcus EDV/Programmierung/link libraries/c++/curl-7.24.0/include/curl/"    -c -o accountsContainer.o accountsContainer.cpp
g++ -o libcurl.exe signatureUpdater.o accountsContainer.o network.o registry.o emailAccount.o filesystem.o  libcurl.o  "Z:/SRS/Verwaltung/EDV/Marcus EDV/Programmierung/link libraries/c++/curl-7.24.0/lib/libcurl.dll"

accountsContainer.o: In function `accountsContainer':
G:\#1Arbeit\htdocs\libcurl/accountsContainer.cpp:11: multiple definition of `accountsContainer::accountsContainer()'

signatureUpdater.o:G:\#1Arbeit\htdocs\libcurl/accountsContainer.h:13: first defined here

collect2: ld returned 1 exit status
make: *** [libcurl.exe] Error 1

Я не понимаю, откуда эта ошибка. Я уже провел некоторые исследования в Интернете для «множественного определения» -ошибки. Это то, что я знаю: Я думаю, что вы можете объявлять классы или функции несколько раз так часто, как хотите, но я должен быть определен только один раз.

И вот что я сделал: Я определил конструктор класса "accountsContainer :: accountsContainer () {...}" в accountsContainer.cpp, который никогда нигде не включается, но должен компилироваться только с моим make-файлом в accountsContainer.o accountContainer.h содержит объявление класса

Но почему компоновщик жалуется на определение accountsContainer :: accountsContainer () {...} в заголовочном файле?

Это мои файлы: "AccountsContainer.h"

/*
 * accountsContainer.h
 *
 *  Created on: 16.03.2012
 *      Author: Admin
 */

#ifndef ACCOUNTSCONTAINER_H_
#define ACCOUNTSCONTAINER_H_

#include "emailAccount.h"
#include <string>
#include <iostream>
#include <algorithm>


class accountsContainer {
public:
    const static int MAX_ACCOUNTS = 50;
private:


    emailAccount srsAccounts[],emailAccounts[];
    //can only be initalized in the constructor
    int nAccounts;
    int nSrsAccounts;

//methods
private:
    void emailToLowerCase();
    void findSrsAccounts();
public:
    accountsContainer();
    void printSrsAccounts();
    emailAccount & getSrsAccount(int);
};

#endif /* ACCOUNTSCONTAINER_H_ */
* * 1022 "accountsContainer.cpp" * * 1023
    /*
 * accountsContainer.cpp
 *
 *  Created on: 16.03.2012
 *      Author: Admin
 */

#include "accountsContainer.h"
#include "signatureUpdater.h"

accountsContainer::accountsContainer() {
    //init variables
    nAccounts = 0;
    nSrsAccounts = 0;

    /*
     * read email Accounts from registry and save them to the srsAccounts Array
     */
    signatureUpdater::reg.getEmailAccounts(srsAccounts,MAX_ACCOUNTS);

    //make all e-mail adresses lower case
    emailToLowerCase();
    findSrsAccounts();


}


void accountsContainer::printSrsAccounts(){
    string locS;
    for(int i=0;i < nSrsAccounts;i++){
        wcout << L"Account " << i << L" : " << srsAccounts[i].displayName <<endl;
        wcout << L"Name: " << srsAccounts[i].accName.c_str() << endl;
        wcout << L"E-Mail:" << srsAccounts[i].email.c_str() << endl << endl;
    }



}
emailAccount & accountsContainer::getSrsAccount(int i){
    return srsAccounts[i];
}
void accountsContainer::emailToLowerCase(){
    wstring s;
    for(int i=0; i < nAccounts; i++){
        s = emailAccounts[i].email;
        std::transform(s.begin(), s.end(), s.begin(), std::ptr_fun<int,int>(std::tolower));
        emailAccounts[i].email = s;
    }
}
void accountsContainer::findSrsAccounts(){
    /*
     * resets Number of SRS accounts
     * then iterates all e-mail accounts
     * and searches for domain srsonline.de
     * in lowercase!
     */
    size_t found;
    wstring emailAdr;
    nSrsAccounts = 0;
    for(int i=0;i<nAccounts;i++){
        emailAdr=emailAccounts[i].email;
        found = emailAdr.rfind(L"srsonline.de");
        if(found != string::npos && (emailAdr.length()-found) == 12){
            /*
            wcout << L"für E-mail Konto: " << emailAdr << endl;
            cout << "srsonline.de found at: " << found << endl;
            */
            // copy SRS Accounts to srsAccounts array
            srsAccounts[nSrsAccounts] = emailAccounts[i];
            nSrsAccounts++;

        }
    }
}

и вот мой make-файл:

CXXFLAGS = -g -Wall -fmessage-length=0 -I "Z:/SRS/Verwaltung/EDV/Marcus EDV/Programmierung/link libraries/c++/curl-7.24.0/include/curl/" #  -O2 no performance improvement because of debugging!

OBJS =       signatureUpdater.o accountsContainer.o network.o registry.o emailAccount.o filesystem.o  libcurl.o 

LIBS = "Z:/SRS/Verwaltung/EDV/Marcus EDV/Programmierung/link libraries/c++/curl-7.24.0/lib/libcurl.dll"



TARGET =    libcurl.exe

$(TARGET):  $(OBJS)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)

all:    $(TARGET)

clean:
    rm -f $(OBJS) $(TARGET)

Я надеюсь, что проблема не в плохой программе-архитектуре / дизайне спасибо за помощь!

1 Ответ

0 голосов
/ 16 марта 2012

Проверьте включение охранников, возможно, вы используете то же имя в другом заголовке.

...