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

[C++, gnumake] Makefile, undefined reference

Object Storage Arubacloud
+1 głos
171 wizyt
pytanie zadane 28 maja 2019 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

Cześć.

Pierwszy raz w życiu korzystam z Makefile. Tutaj jak on wygląda:

CC = g++
WRGS = -Wall -Wextra -Wunused -Wmisleading-indentation -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wuseless-cast
CSTD = c++17
BOOST_INC = D:\Private\Boost\boost\include\boost-1_70
BOOST_LIB = D:\Private\Boost\boost\lib

all: others.o parser.o parser_test.o
	$(CC) -std=$(CSTD) $(WRGS) others.o parser.o parser_test.o -o parser

parser_test.o:
	$(CC) -std=$(CSTD) $(WRGS) parser_test.cpp -c -o parser_test.o -isystem$(BOOST_INC) -L$(BOOST_LIB) -lboost_filesystem

parser.o: 
	$(CC) -std=$(CSTD) $(WRGS) parser/parser.cpp -c -o parser.o

others.o: 
	$(CC) -std=$(CSTD) $(WRGS) others/others.cpp -c -o others.o

clean:
	del *.o

tutaj struktura plików:
 

D:.
│   args.h
│   file_struct
│   Makefile
│   parser_test.cpp
│
├───.vscode
│...
│
├───others
│       others.cpp
│       others.h
│       others.h.gch
│
└───parser
        parser.cpp
        parser.h
        parser.h.gch

parser.cpp includuje others.h,
parser_test.cpp includuje parser.h
args.h includuje others.h

 

tutaj deklaracja i definicja parser::parser():

#include <string_view>
#ifndef PARSER_H
#define PARSER_H

namespace parser{
   ...

    bool parse(std::string_view);
    ...
}

#endif
#include "parser.h"
#include "../others/others.h"
#include <iostream>
#include <fstream>

...

bool parser::parse(std::string_view file_path){
    auto ret = getEnvVar(file_path);
    std::cout<< (ret==std::string_view() ? "NULL" : file_path);
    return true;
}

 

make wywala mi:

parser_test.o:parser_test.cpp:(.text+0x1d8): undefined reference to `parser::parse(std::basic_string_view<char, std::char_traits<char> >)'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:8: all] Error 1

 

i nie wiem o co może chodzi, skoro wszystko wydaje się linkować poprawnie. Kiedy osobno kompiluję jakiś plik cpp używający parser::parse z parser/parser.cpp i others/others.cpp, to wszystko działa.

 

Prosiłbym o pomoc.

2 odpowiedzi

+2 głosów
odpowiedź 29 maja 2019 przez DeBos123 Nałogowiec (44,950 p.)
wybrane 29 maja 2019 przez Hiskiel
 
Najlepsza

Kompilując plik parser_test.o musisz dodać plik parser.o.

W pliku .h masz tylko informacje o tym, że takie metody istnieją w pliku .o, ale samego pliku nie dodałeś.

1
komentarz 29 maja 2019 przez Hiskiel Pasjonat (22,830 p.)
O kurcze, racja. Dziękuję bardzo.
–1 głos
odpowiedź 29 maja 2019 przez j23 Mędrzec (194,920 p.)
edycja 29 maja 2019 przez j23

Nie znam się na makefile, ale podejrzewam, że problem leży w tym, że pliki others.o i parser.o lezą w podkatalogach i są niewidoczne z "poziomu" wywołania makefile.

komentarz 29 maja 2019 przez DeBos123 Nałogowiec (44,950 p.)

W linii 13 parser.o to tylko nazwa reguły, która może być dowolna.

W linii 14 natomiast ma 'zaznaczone', że plik jest w podkatalogu: parser/parser.cpp

Podobne pytania

+1 głos
0 odpowiedzi 312 wizyt
pytanie zadane 12 kwietnia 2020 w C i C++ przez Patrykosik88 Początkujący (340 p.)
+1 głos
0 odpowiedzi 171 wizyt
pytanie zadane 23 sierpnia 2018 w Inne języki przez Hiskiel Pasjonat (22,830 p.)
0 głosów
1 odpowiedź 184 wizyt
pytanie zadane 18 października 2015 w C i C++ przez niezalogowany

92,555 zapytań

141,402 odpowiedzi

319,553 komentarzy

61,939 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!

...