• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
695 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,340 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,020 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,030 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,340 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,030 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ź 554 wizyt
0 głosów
1 odpowiedź 1,744 wizyt
pytanie zadane 15 września 2016 w C i C++ przez timrh Mądrala (6,010 p.)
0 głosów
2 odpowiedzi 537 wizyt

93,191 zapytań

142,206 odpowiedzi

322,041 komentarzy

62,518 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2738p. - CC PL
  5. 2704p. - Tomasz Bielak
  6. 2678p. - Łukasz Siedlecki
  7. 2666p. - rucin93
  8. 2584p. - Adrian Wieprzkowicz
  9. 2536p. - Mikbac
  10. 2485p. - Marcin Putra
  11. 2418p. - Michal Drewniak
  12. 2239p. - Michał Telesz
  13. 2156p. - Anonim 3619784
  14. 1733p. - rafalszastok
  15. 1650p. - Mariusz Fornal
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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...