• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

"Undefined reference" dla funkcji w drugim pliku .cpp

Object Storage Arubacloud
0 głosów
496 wizyt
pytanie zadane 17 grudnia 2021 w C i C++ przez Czarus Obywatel (1,310 p.)

Witam, pojawiał się już podobny problem na forum ale nie rozwiązuje on u mnie problemu.

Otóż używam VS Code i nie ma to w zasadzie większego znaczenia bo na innych też mi ten sam błąd się pojawia.


Problemem jest to, że wszyscy gdzie nie patrzę na YT, forach internetowych itd. dołączają pliki w ten sposób:

main.cpp  ------->  Rectangle.h  <------- Rectangle.cpp

Mi to nie działa sad zwracając błąd : c:/program files/mingw/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: main.o:main.cpp:(.text+0xe): undefined reference to `draw_rectangle()'

Natomiast działa mi: main.cpp  ------->  Rectangle.cpp  -------> Rectangle.h

Mógłbym tak robić dalej ale brzydko wygląda w mainie zainkludowany plik .cpp i wszyscy tak robią to pomyślałem żeby o to zapytać. Dodam, że wszystkie pliki są w jednym folderze i z góry od razu dziękuję za każdą pomoc smiley. Kod dla którego wyskakuje error:

#include "Rectangle.h"

int main()
{
    draw_rectangle();
}
#pragma once

void draw_rectangle();
#include <iostream>
#include "Rectangle.h"

void draw_rectangle()
{
    std::cout << "Draw";
}

 

1
komentarz 17 grudnia 2021 przez Oscar Nałogowiec (29,290 p.)
To jeszcze podaj jak linkujesz ten program. W różnych IDE to zwykle występuje pod pojęciem "project" i tam można wymienić pliki źródłowe, które wchodzą w skład programu.
1
komentarz 17 grudnia 2021 przez Sadako Obywatel (1,240 p.)
Zgadzam się z poprzednikiem. Jak nie napiszesz jak budujesz i jak linkujesz to niezbyt da Ci sie pomóc. Jak używasz IDE to też możesz podać nazwę.

Normalnie, żeby to Ci działało to w uproszczeniu trzeba skompilować main.cpp, skompilować Rectangle.cpp i zlinkować. Wtedy w main.cpp możesz zrobić normalnego include tylko pliku nagłówkowego Rectangle.h
komentarz 17 grudnia 2021 przez Czarus Obywatel (1,310 p.)

Tak wygląda u mnie "EKSPLORATOR" VS Code (te pokreślone to w między czasie dodałem Edit: Makefile też nie było) 

A dodaje wszystko klikając na folder prawym przyciskiem i "Open with Code"

Opcji stworzenia classy w folderach .h i .cpp w VS Code nie zauważyłem i dodaje pliki po prostu tworząc nowe pliki ręcznie

komentarz 17 grudnia 2021 przez tkz Nałogowiec (42,000 p.)
Jak kompilujesz?
1
komentarz 17 grudnia 2021 przez Czarus Obywatel (1,310 p.)

Problem już rozwiązał "toko" 

Używałem (do teraz smiley)

g++ main.cpp

+ jakieś dodatki ale nie dołączałem innych plików .cpp

Dziękuję wszystkim za pomoc <3

1 odpowiedź

+2 głosów
odpowiedź 17 grudnia 2021 przez toko Dyskutant (7,670 p.)
wybrane 17 grudnia 2021 przez Czarus
 
Najlepsza

Podejrzewam, że masz taki sam problem jak kiedyś ja:

kompilujesz program tak:

g++ -o program main.cpp

a powinieneś tak:

g++ -o program main.cpp Rectangle.cpp # lub g++ -o program *.cpp jeśli wszystkie pliki .cpp wchodzą w skład projektu

oczywiście są to opcje dla kompilatora g++. Jak masz jakiś inny to może to wyglądać troszkę inaczej.

komentarz 17 grudnia 2021 przez Oscar Nałogowiec (29,290 p.)

To jest pewne pójście na skróty. Sam to często stosuje gdy mam malutkie programy, ale formalnie to zbudowanie programu składa się z 3 etapów. gcc/g++ to taki kombajn, który potrafi wykonać od razu kilka etapów, zależnie od plików i parametrów które dostanie. Kiedy jednak dojdziesz do makefile powinieneś znać poszczególne etapy, by wiedzieć co wpisać do tego pliku.
 

# kompilacja pliku Rectangle.cpp
g++ -c Rectangle.cpp -o Rectangle.o

# kompilacja pliku main.cpp
g++ -c main.cpp -o main.o

#linkowanie
g++ -o Program main.o Rectangle.o


Przy większej liczbie modułów warto byłoby jeszcze stworzyć biblioteke programem ar. To powoduje, że kompilator może pominąć nieużywane moduły.

Taka skrócona droga ma jedną zaletę - nie zostają pliki pośrednie, ale z drugiej strony zawsze trzeba wykonać pełną kompilacje wszystkiego.

komentarz 17 grudnia 2021 przez toko Dyskutant (7,670 p.)
Masz rację, jednak przy niedużych projektach jest to niepotrzebne. Ja nigdy nie użyłem tej opcji i żyję. Nie robię co prawda dużych projektów, lecz się uczę, ale autor pytania nie wydaje się być na bardzo zaawansowanym poziomie, więc pewnie też częściej będzie używał skróconej wersji.

Podobne pytania

0 głosów
1 odpowiedź 422 wizyt
0 głosów
1 odpowiedź 1,444 wizyt
pytanie zadane 15 września 2016 w C i C++ przez timrh Mądrala (6,030 p.)
0 głosów
2 odpowiedzi 405 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...