Strona 1 z 2

[+] C++ - undefined reference

: 19 maja 2007, 10:03
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ę.

: 19 maja 2007, 12:28
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

: 19 maja 2007, 15:56
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.

: 19 maja 2007, 17:45
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.

: 19 maja 2007, 20:09
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ć.

: 19 maja 2007, 20:49
autor: chyl-o
a czy probowałeś tak jak ja Ci podałem?

: 19 maja 2007, 21:09
autor: chudy
Tak. Wpisałem dokładnie tak:

Kod: Zaznacz cały

g++ -o Employee EmployeeTest.cpp Employee.cpp

: 19 maja 2007, 23:06
autor: chyl-o
daj caly output bo nie mozna sie nic zorietowac

: 20 maja 2007, 00:38
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.....................

: 20 maja 2007, 01:21
autor: chyl-o
ponton, nie myle pojec tylko mowie ze kompilacja rozlaczna z odkomentowaniem main daje poprawny wynik kompilacji.