Kompilowanie projektu z wieloma plikami - error LNK2005 i error LNK1169
Ostatnio zmodyfikowano 2014-04-28 16:00
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 #include "kalkulator.cpp"
int main() { liczydlo(); return 0; } kalkulator.cpp #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; } |
|
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-files/Do mojego kodu potrzebowałem dopisać w main.cpp niewiele. Nowe wygląda tak #include <iostream>
int liczydlo();
int main() { liczydlo(); return 0; } Z tamtej strony można wyczytać, że do tego najlepiej używać nagłówków :) |
|
michal11 |
» 2014-04-27 23:47:10 Lepiej chyba by było jak byś do pliku kalkulator.cpp dodał #ifndef KALKULATOR_CPP #define KALKULATOR_CPP
a na koniec |
|
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. |
|
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ę :) #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 :) |
|
« 1 » |