Nagłówki *.hpp - błąd g++ - undefined reference to ...

0

Witam, uczę się korzystania z nagłówków w C++, ale napotkałem problem. Pliki programu znajdują się w jednym folderze, kompiluję je g++, a następnie tworzę plik wykonywalny za pomocą Geany: g++ -Wall -o "%e" "%f", ale pojawia się błąd linkera:

 g++ -Wall -o "main" "main.cpp" (w katalogu /home/michal/Pulpit/Nowy)
/tmp/ccPhPzET.o: In function `main':
main.cpp:(.text+0x65): undefined reference to `mod(int)'
collect2: ld returned 1 exit status
Kompilacja nie powiodła się

main.cpp

#include<iostream>
#include"naglowek.hpp"

using namespace std;

int main()
{
    int a;
    cout<<"Podaj liczbe: "<<endl;
    cin>>a;
    cout<<"a = "<<a<<endl;
    cout<<"|a| = "<<mod(a)<<endl;
    return 0;
}

naglowek.hpp

#ifndef naglowek_hpp
#define naglowek_hpp
#endif

int mod(int);

naglowek.cpp

 #include"naglowek.hpp"

int mod(int liczba)
{
    return liczba>0 ? liczba : -liczba;
}
0

Trza skompilować używając g++ <jakies_tam_flagi> main.cpp naglowek.cpp

0

Źle użyto także header guard w pliku nagłówek.hpp. Powinno być:

#ifndef naglowek_hpp
#define naglowek_hpp

int mod(int);

#endif
0

kompilacja się udaje linker ma problem

1

g++ be flagi -c kompiluje i linkuje więc masz do wyboru kompilować oba osobno z flagą -c i potem je ręcznie linkować lub podać oba pliki na raz jako źródła i skompiluje oraz od razu zlinkuje oba.

1

ja może wyjaśnię to co winerfresh napisał:

albo robisz
g++ main.cpp naglowek.cpp -o mainczyli wszystko na raz, albo po kolei

g++ -c main.cpp
g++ -c naglowek.cpp
g++ main.o naglowek.o -o main

PS. czy GCC nigdy nie zrezygnuje z absurdu, jakim jest domyślna nazwa pliku wyjściowego a.out? zaoszczędziłoby się każdorazowego podawania -o.
chyba żaden inny kompilator nie zachowuje się w tak głupi sposób.

0

Wielkie dzięki winerfresh i Azarien:

Byłem leniem i nie chcialo mi się uruchomić terminala i kompilowałem za pomocą Geany (F8, F9 :D) co skutkowało wykonaniem takich komend:

g++ -c main.cpp
g++ -c naglowek.cpp
g++ main.o main

Poprawnie ma jednak być:

g++ -c main.cpp
g++ -c naglowek.cpp
g++ naglowek.o main.o main

Pozdrawiam i dzięki za pomoc :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0