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

[C++, gnumake] Makefile, undefined reference

Aruba Cloud - Virtual Private Server VPS
+1 głos
231 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 (195,240 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 521 wizyt
pytanie zadane 12 kwietnia 2020 w C i C++ przez Patrykosik88 Początkujący (340 p.)
+1 głos
0 odpowiedzi 200 wizyt
pytanie zadane 23 sierpnia 2018 w Inne języki przez Hiskiel Pasjonat (22,830 p.)
0 głosów
1 odpowiedź 222 wizyt
pytanie zadane 18 października 2015 w C i C++ przez niezalogowany

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,662 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

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!

...