[+] C++ - undefined reference

Potrzebujesz pomocy z C, C++, perl, python, itp.
chudy
Posty: 5
Rejestracja: 10 maja 2007, 09:11
Lokalizacja: Łódź

[+] C++ - undefined reference

Post autor: chudy »

Witam!

Mam następujący problem. Uczę się C++ z książki "C++ Zaawansowane Programowanie" i wszystko było ładnie i pięknie dopóki nie doszedłem do takiego przykładu, który znajduje sie w załączniku. Gdy kompiluje program poleceniem g++ EmployeeTest.cpp wyskakują mi błędy:

Kod: Zaznacz cały

/tmp/cc8dI8yV.o: In function `main':
EmployeeTest.cpp :( .text+0x9d): undefined reference to `Records::Employee::Employee()'
EmployeeTest.cpp :( .text+0xc5): undefined reference to `Records::Employee::setFirstName(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
EmployeeTest.cpp :( .text+0x134): undefined reference to `Records::Employee::setLastName(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
EmployeeTest.cpp :( .text+0x16d): undefined reference to `Records::Employee::setEmployeeNumber(int)'
EmployeeTest.cpp :( .text+0x194): undefined reference to `Records::Employee::setSalary(int)'
EmployeeTest.cpp :( .text+0x1a2): undefined reference to `Records::Employee: :p romote(int)'
EmployeeTest.cpp :( .text+0x1b0): undefined reference to `Records::Employee: :p romote(int)'
EmployeeTest.cpp :( .text+0x1b9): undefined reference to `Records::Employee::hire()'
EmployeeTest.cpp :( .text+0x1c2): undefined reference to `Records::Employee::display()'
collect2: ld returned 1 exit status
Niestety nie wiem co z tym zrobić. Bardzo proszę o pomoc i z góry dziękuję.
chyl-o
Junior Member
Posty: 621
Rejestracja: 24 maja 2006, 21:06
Lokalizacja: Lublin

Post autor: chyl-o »

Nie kompilujsz EmployeeTest.cpp razem z Epmloyee.cpp to jest blad, razem wykonana kompilacja nie zwraca blędów:

Kod: Zaznacz cały

g++ -o Employee EmployeeTest.cpp Employee.cpp
Dodatkowo możesz sobie poczytać o Makefile jako praca domowa ;)

pozdrawiam
Debian
ponton
Beginner
Posty: 406
Rejestracja: 24 stycznia 2007, 01:40
Lokalizacja: Kalisz/Wroc³aw

Post autor: ponton »

Kompilować można, tylko domyślnie g++ wywołuje linker, który wywala te błędy. Jak chcesz tylko kompilować (wtedy nie pojawią się błędy), to wywołuj g++ z parametrem (chyba) -c.
chyl-o
Junior Member
Posty: 621
Rejestracja: 24 maja 2006, 21:06
Lokalizacja: Lublin

Post autor: chyl-o »

ponton pisze:Kompilować można, tylko domyślnie g++ wywołuje linker, który wywala te błędy. Jak chcesz tylko kompilować (wtedy nie pojawią się błędy), to wywołuj g++ z parametrem (chyba) -c.
Głupoty opowiadasz i tyle. Przecież to jest rozłączna kompilacja i z tym parametrem czy bez i tak się nie przekompiluje, dopiero kiedy dodasz liste wszystkich plików do kompilacji to pójdzie.
chudy
Posty: 5
Rejestracja: 10 maja 2007, 09:11
Lokalizacja: Łódź

Post autor: chudy »

Gdy próbuje skompilować tak jak zostało podane wcześniej otrzymuję taki błąd:

Kod: Zaznacz cały

/usr/lib/gcc/x86_64-linux-gnu/4.1.2/../../../../lib64/crt1.o: In function `_start':
../sysdeps/x86_64/elf/start.S:109: undefined reference to `main'
collect2: ld returned 1 exit status

Jak widać używam platformy AMD64, ale nie wiem co tutaj mam zrobić.
chyl-o
Junior Member
Posty: 621
Rejestracja: 24 maja 2006, 21:06
Lokalizacja: Lublin

Post autor: chyl-o »

a czy probowałeś tak jak ja Ci podałem?
chudy
Posty: 5
Rejestracja: 10 maja 2007, 09:11
Lokalizacja: Łódź

Post autor: chudy »

Tak. Wpisałem dokładnie tak:

Kod: Zaznacz cały

g++ -o Employee EmployeeTest.cpp Employee.cpp
chyl-o
Junior Member
Posty: 621
Rejestracja: 24 maja 2006, 21:06
Lokalizacja: Lublin

Post autor: chyl-o »

daj caly output bo nie mozna sie nic zorietowac
ponton
Beginner
Posty: 406
Rejestracja: 24 stycznia 2007, 01:40
Lokalizacja: Kalisz/Wroc³aw

Post autor: ponton »

Debian, mylisz pojęcie kompilacji z konsolidacją. chudemu błędy wywala collect2, czyli linker. Pliki są już skompilowane do *.o, tylko nie zlinkowane, bo nie ma bibliotek.

chudy, "undefined reference to `main`"... masz w tych plikach funkcję main()?

EDIT: nie zauważyłem tych plików w załączniku....

EDIT2:

Kod: Zaznacz cały

// Employee.h

#include <iostream>

namespace Records {
  const int kDefaultStartingSalary = 30000;
  class Employee
czy zmienna kDefcośtam jest globalna w pliku .h? W takim razie ten plik jest dołączany do dwóch źródeł, dwa razy kompilowany i linker napotyka dwie faktyczne definicje tej zmiennej i wywala błąd (trochę dziwny jednak). Rozwiązaniem jest przeniesienie tej definicji do jakiegoś pliku .cpp, a w .h dodanie słówka "extern" (por. różnice między deklaracją, a definicją).

EDIT3: OMG, ślepy jestem!.... Dopiero teraz zauważyłem, że funkcja main() jest okomentowana.....................
chyl-o
Junior Member
Posty: 621
Rejestracja: 24 maja 2006, 21:06
Lokalizacja: Lublin

Post autor: chyl-o »

ponton, nie myle pojec tylko mowie ze kompilacja rozlaczna z odkomentowaniem main daje poprawny wynik kompilacji.
ODPOWIEDZ