Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kompilowanie projektu z wieloma plikami - error LNK2005 i error LNK1169

Ostatnio zmodyfikowano 2014-04-28 16:00
Autor Wiadomość
Aaros
Temat założony przez niniejszego użytkownika
Kompilowanie projektu z wieloma plikami - error LNK2005 i error LNK1169
» 2014-04-27 22:04:06
Mam problem ze skompilowaniem programu. Na konsoli wywala mi taki komunikat.

1>------ Build started: Project: NewName, Configuration: Debug x64 ------
1>Build started 2014-04-27 21:52:18.
1>InitializeBuildStatus:
1>  Touching "x64\Debug\NewName.unsuccessfulbuild".
1>ClCompile:
1>  main.cpp
1>  kalkulator.cpp
1>  Generating Code...
1>main.obj : error LNK2005: "int __cdecl liczydlo(void)" (?liczydlo@@YAHXZ) already defined in kalkulator.obj
1>C:\Users\Aaros\documents\visual studio 2010\Projects\NewName\x64\Debug\NewName.exe : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:02.12
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

W projekcie mam w folderze "Source Files" 2 pliki main.cpp i kalkulator.cpp.
Problem pojawia się jeśli w projekcie są podpięte te dwa pliki. Jeśli jest tylko main.cpp to problemu nie ma. Raz mi się chyba udało odpalić z obecnymi dwoma plikami xD

main.cpp
C/C++
#include "kalkulator.cpp"

int main() {
   
    liczydlo();
   
    return 0;
}

kalkulator.cpp
C/C++
#include <iostream>
#include <windows.h>
#include <cstdio>


using namespace std;


int liczydlo() {
   
    int i, wynik;
    double a = 0, b = 0;
   
    do {
        system( "cls" );
        cout << "Domowy kalkulator\n";
        cout << "[1] Dodawanie\n";
        cout << "[2] Odejmowanie\n";
        cout << "[3] Mnozenie\n";
        cout << "[4] Dzielenie\n";
        cout << "[5] Dzielenie calkowite\n";
        cout << "[6] Reszta z dzielenia\n";
        cout << "[9] Podaj liczby\n";
        cout << "[0] Wyjdz\n";
        cin >> i;
       
        system( "cls" );
       
        switch( i ) {
        case 1: {
                if( a == 0 && b == 0 ) {
                    system( "cls" );
                    cout << "Musisz najpierw podac liczby\nWybiezrz [9]\n\n";
                    system( "pause" );
                    break;
                }
                cout << "Dodawanie dwoch liczb: " << a << " + " << b << " = " << a + b << "\n\n";
                system( "pause" );
                break;
            }
        case 2: {
                if( a == 0 && b == 0 ) {
                    system( "cls" );
                    cout << "Musisz najpierw podac liczby\nWybiezrz [9]\n\n";
                    system( "pause" );
                    break;
                }
                cout << "Odejmowanie dwoch liczb: " << a << " - " << b << " = " << a - b << "\n\n";
                system( "pause" );
                break;
            }
        case 3: {
                if( a == 0 && b == 0 ) {
                    system( "cls" );
                    cout << "Musisz najpierw podac liczby\nWybiezrz [9]\n\n";
                    system( "pause" );
                    break;
                }
                cout << "Mnozenie dwoch liczb: " << a << " * " << b << " = " << a * b << "\n\n";
                system( "pause" );
                break;
            }
        case 4: {
                if( a == 0 && b == 0 ) {
                    system( "cls" );
                    cout << "Musisz najpierw podac liczby\nWybiezrz [9]\n\n";
                    system( "pause" );
                    break;
                }
                cout << "Dzielenie dwoch liczb: " << a << " / " << b << " = " << a / b << "\n\n";
                system( "pause" );
                break;
            }
        case 5: {
                if( a == 0 && b == 0 ) {
                    system( "cls" );
                    cout << "Musisz najpierw podac liczby\nWybiezrz [9]\n\n";
                    system( "pause" );
                    break;
                }
                wynik =( int )( a / b );
                cout << "Dzielenie calkowite dwoch liczb: " << a << " div " << b << " = " << wynik << "\n\n";
                system( "pause" );
                break;
            }
        case 6: {
                if( a == 0 && b == 0 ) {
                    system( "cls" );
                    cout << "Musisz najpierw podac liczby\nWybiezrz [9]\n\n";
                    system( "pause" );
                    break;
                }
                wynik = int( a ) % int( b );
                cout << "Reszta z dzielenia dwoch liczb: " <<( int ) a << " mod " <<( int ) b << " = " << wynik << "\n\n";
                system( "pause" );
                break;
            }
        case 9: {
                cout << "Podaj dwie liczby\n";
                cin >> a;
                if( cin.good() != 1 ) {
                    cout << "Wprowadzone dane nie sa poprawne\nWybierz ponownie akcje aby kontynuowac\n\n";
                    std::cin.clear();
                    std::cin.sync();
                    system( "pause" );
                    break;
                }
                cin >> b;
                if( cin.good() != 1 ) {
                    cout << "Wprowadzone dane nie sa poprawne\nWybierz ponownie akcje aby kontynuowac\n\n";
                    std::cin.clear();
                    std::cin.sync();
                    system( "pause" );
                    break;
                }
                break;
            }
        case 0: {
                cout << "Wychodze z programu\n";
                i = 0;
                break;
            }
            default: {
                break;
            }
        }
       
    } while( i != 0 );
   
    printf( "\n" );
    system( "pause" );
    return 0;
}
P-108822
Aaros
Temat założony przez niniejszego użytkownika
» 2014-04-27 23:38:54
Problem rozwiązałem ;)
Natknąłem się w internecie na coś takiego jak Forward declarations tutaj http://www.learncpp.com​/cpp-tutorial​/18-programs-with-multiple-fil​es​/

Do mojego kodu potrzebowałem dopisać w main.cpp niewiele. Nowe wygląda tak
C/C++
#include <iostream>

int liczydlo();

int main() {
   
    liczydlo();
   
    return 0;
}

Z tamtej strony można wyczytać, że do tego najlepiej używać nagłówków :)
P-108827
michal11
» 2014-04-27 23:47:10
Lepiej chyba by było jak byś do pliku kalkulator.cpp dodał

C/C++
#ifndef KALKULATOR_CPP
#define KALKULATOR_CPP

a na koniec

C/C++
#endif
P-108828
pekfos
» 2014-04-28 09:57:25
Lepiej by było, jakby nie dołączał plików .cpp przez #include, bo służą do zupełnie czego innego.

Lepiej chyba by było jak byś do pliku kalkulator.cpp dodał
To nic nie zmieni.
P-108838
Aaros
Temat założony przez niniejszego użytkownika
» 2014-04-28 16:00:17
Sądzę, że temat rozwiązany.
A wyjaśnieniem jest używanie nagłówków ;)
Także trzeba stworzyć plik kalkulator.h, który będzie zawierał tą definicję :)
C/C++
#ifndef KALKULATOR_H
#define KALKULATOR_H

int kalkulator();

#endif
kalkulator.cpp pozostaje bez zmian
a w mainie includujemy kalkulator.h

#include "kalkulator.h"


Także temat zamykam :)
P-108852
« 1 »
  Strona 1 z 1