• 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

0 głosów
899 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,360 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,040 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 (8,370 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,360 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 (8,370 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ź 648 wizyt
0 głosów
1 odpowiedź 1,984 wizyt
pytanie zadane 15 września 2016 w C i C++ przez timrh Mądrala (6,010 p.)
0 głosów
2 odpowiedzi 835 wizyt

93,630 zapytań

142,551 odpowiedzi

323,054 komentarzy

63,134 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2174p. - dia-Chann
  2. 2153p. - DziarnowskiJ
  3. 2123p. - Łukasz Piwowar
  4. 2077p. - raydeal
  5. 1989p. - CC PL
  6. 1957p. - Maurycy W
  7. 1954p. - Adrian Wieprzkowicz
  8. 1895p. - rucin93
  9. 1855p. - Michal Drewniak
  10. 1777p. - robwarsz
  11. 1701p. - rafalszastok
  12. 1588p. - Tomasz Bielak
  13. 1564p. - Łukasz Eckert
  14. 1491p. - Rafał Trójniak
  15. 1377p. - ssynowiec
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...